1*25cf3198SRaphael Gault #include <stdbool.h> 2*25cf3198SRaphael Gault #include <stdlib.h> 3*25cf3198SRaphael Gault #include <string.h> 4*25cf3198SRaphael Gault #include <linux/bitops.h> 5*25cf3198SRaphael Gault #include <linux/err.h> 6*25cf3198SRaphael Gault #include <linux/sizes.h> 7*25cf3198SRaphael Gault #include <linux/types.h> 8*25cf3198SRaphael Gault 9*25cf3198SRaphael Gault #include "kvm/kvm.h" 10*25cf3198SRaphael Gault #include "kvm/kvm-arch.h" 11*25cf3198SRaphael Gault #include "kvm/devices.h" 12*25cf3198SRaphael Gault #include "kvm/fdt.h" 13*25cf3198SRaphael Gault #include "kvm/mutex.h" 14*25cf3198SRaphael Gault #include "kvm/util.h" 15*25cf3198SRaphael Gault 16*25cf3198SRaphael Gault /* 17*25cf3198SRaphael Gault * The EDK2 driver hardcodes two 16-bit chips on a 32-bit bus. 18*25cf3198SRaphael Gault * This code supports one or two chips (enforced below). 19*25cf3198SRaphael Gault */ 20*25cf3198SRaphael Gault #define CFI_NR_FLASH_CHIPS 2 21*25cf3198SRaphael Gault 22*25cf3198SRaphael Gault /* We always emulate a 32 bit bus width. */ 23*25cf3198SRaphael Gault #define CFI_BUS_WIDTH 4 24*25cf3198SRaphael Gault 25*25cf3198SRaphael Gault /* The *effective* size of an erase block (over all chips) */ 26*25cf3198SRaphael Gault #define FLASH_BLOCK_SIZE SZ_64K 27*25cf3198SRaphael Gault #define FLASH_BLOCK_SIZE_PER_CHIP \ 28*25cf3198SRaphael Gault (FLASH_BLOCK_SIZE / CFI_NR_FLASH_CHIPS) 29*25cf3198SRaphael Gault 30*25cf3198SRaphael Gault #define PROGRAM_BUFF_SIZE_BITS 7 31*25cf3198SRaphael Gault #define PROGRAM_BUFF_SIZE (1U << PROGRAM_BUFF_SIZE_BITS) 32*25cf3198SRaphael Gault #define PROGRAM_BUFF_SIZE_BITS_PER_CHIP \ 33*25cf3198SRaphael Gault (PROGRAM_BUFF_SIZE_BITS + 1 - CFI_NR_FLASH_CHIPS) 34*25cf3198SRaphael Gault 35*25cf3198SRaphael Gault /* CFI commands */ 36*25cf3198SRaphael Gault #define CFI_CMD_LOCK_BLOCK 0x01 37*25cf3198SRaphael Gault #define CFI_CMD_ALTERNATE_WORD_PROGRAM 0x10 38*25cf3198SRaphael Gault #define CFI_CMD_ERASE_BLOCK_SETUP 0x20 39*25cf3198SRaphael Gault #define CFI_CMD_WORD_PROGRAM 0x40 40*25cf3198SRaphael Gault #define CFI_CMD_CLEAR_STATUS_REG 0x50 41*25cf3198SRaphael Gault #define CFI_CMD_LOCK_BLOCK_SETUP 0x60 42*25cf3198SRaphael Gault #define CFI_CMD_READ_STATUS_REG 0x70 43*25cf3198SRaphael Gault #define CFI_CMD_READ_JEDEC_DEVID 0x90 44*25cf3198SRaphael Gault #define CFI_CMD_READ_CFI_QUERY 0x98 45*25cf3198SRaphael Gault #define CFI_CMD_CONFIRM 0xd0 46*25cf3198SRaphael Gault #define CFI_CMD_BUFFERED_PROGRAM_SETUP 0xe8 47*25cf3198SRaphael Gault #define CFI_CMD_READ_ARRAY 0xff 48*25cf3198SRaphael Gault 49*25cf3198SRaphael Gault #define CFI_STATUS_PROTECT_BIT 0x02 50*25cf3198SRaphael Gault #define CFI_STATUS_PROGRAM_LOCK_BIT 0x10 51*25cf3198SRaphael Gault #define CFI_STATUS_ERASE_CLEAR_LOCK_BIT 0x20 52*25cf3198SRaphael Gault #define CFI_STATUS_LOCK_ERROR CFI_STATUS_PROGRAM_LOCK_BIT | \ 53*25cf3198SRaphael Gault CFI_STATUS_PROTECT_BIT 54*25cf3198SRaphael Gault #define CFI_STATUS_ERASE_ERROR CFI_STATUS_ERASE_CLEAR_LOCK_BIT | \ 55*25cf3198SRaphael Gault CFI_STATUS_PROGRAM_LOCK_BIT 56*25cf3198SRaphael Gault #define CFI_STATUS_READY 0x80 57*25cf3198SRaphael Gault 58*25cf3198SRaphael Gault /* 59*25cf3198SRaphael Gault * CFI query table contents, as far as it is constant. 60*25cf3198SRaphael Gault * The dynamic information (size, etc.) will be generated on the fly. 61*25cf3198SRaphael Gault */ 62*25cf3198SRaphael Gault #define CFI_GEOM_OFFSET 0x27 63*25cf3198SRaphael Gault static const u8 cfi_query_table[] = { 64*25cf3198SRaphael Gault /* CFI query identification string */ 65*25cf3198SRaphael Gault [0x10] = 'Q', 'R', 'Y', /* ID string */ 66*25cf3198SRaphael Gault 0x01, 0x00, /* primary command set: Intel/Sharp extended */ 67*25cf3198SRaphael Gault 0x31, 0x00, /* address of primary extended query table */ 68*25cf3198SRaphael Gault 0x00, 0x00, /* alternative command set: unused */ 69*25cf3198SRaphael Gault 0x00, 0x00, /* address of alternative extended query table*/ 70*25cf3198SRaphael Gault /* system interface information */ 71*25cf3198SRaphael Gault [0x1b] = 0x45, /* minimum Vcc voltage: 4.5V */ 72*25cf3198SRaphael Gault 0x55, /* maximum Vcc voltage: 5.5V */ 73*25cf3198SRaphael Gault 0x00, /* minimum Vpp voltage: 0.0V (unused) */ 74*25cf3198SRaphael Gault 0x00, /* maximum Vpp voltage: 0.0V *(unused) */ 75*25cf3198SRaphael Gault 0x01, /* timeout for single word program: 2 us */ 76*25cf3198SRaphael Gault 0x01, /* timeout for multi-byte program: 2 us */ 77*25cf3198SRaphael Gault 0x01, /* timeout for block erase: 2 ms */ 78*25cf3198SRaphael Gault 0x00, /* timeout for full chip erase: not supported */ 79*25cf3198SRaphael Gault 0x00, /* max timeout for single word program: 1x */ 80*25cf3198SRaphael Gault 0x00, /* max timeout for mulit-byte program: 1x */ 81*25cf3198SRaphael Gault 0x00, /* max timeout for block erase: 1x */ 82*25cf3198SRaphael Gault 0x00, /* max timeout for chip erase: not supported */ 83*25cf3198SRaphael Gault /* flash geometry information */ 84*25cf3198SRaphael Gault [0x27] = 0x00, /* size in power-of-2 bytes, filled later */ 85*25cf3198SRaphael Gault 0x05, 0x00, /* interface description: 32 and 16 bits */ 86*25cf3198SRaphael Gault PROGRAM_BUFF_SIZE_BITS_PER_CHIP, 0x00, 87*25cf3198SRaphael Gault /* number of bytes in write buffer */ 88*25cf3198SRaphael Gault 0x01, /* one erase block region */ 89*25cf3198SRaphael Gault 0x00, 0x00, 0x00, 0x00, /* number and size of erase blocks, generated */ 90*25cf3198SRaphael Gault /* Intel primary algorithm extended query table */ 91*25cf3198SRaphael Gault [0x31] = 'P', 'R', 'I', 92*25cf3198SRaphael Gault '1', '0', /* version 1.0 */ 93*25cf3198SRaphael Gault 0xa0, 0x00, 0x00, 0x00, /* optional features: instant lock & pm-read */ 94*25cf3198SRaphael Gault 0x00, /* no functions after suspend */ 95*25cf3198SRaphael Gault 0x01, 0x00, /* only lock bit supported */ 96*25cf3198SRaphael Gault 0x50, /* best Vcc value: 5.0V */ 97*25cf3198SRaphael Gault 0x00, /* best Vpp value: 0.0V (unused) */ 98*25cf3198SRaphael Gault 0x01, /* number of protection register fields */ 99*25cf3198SRaphael Gault 0x00, 0x00, 0x00, 0x00, /* protection field 1 description */ 100*25cf3198SRaphael Gault }; 101*25cf3198SRaphael Gault 102*25cf3198SRaphael Gault /* 103*25cf3198SRaphael Gault * Those states represent a subset of the CFI flash state machine. 104*25cf3198SRaphael Gault */ 105*25cf3198SRaphael Gault enum cfi_flash_state { 106*25cf3198SRaphael Gault READY, 107*25cf3198SRaphael Gault LOCK_BLOCK_SETUP, 108*25cf3198SRaphael Gault WORD_PROGRAM, 109*25cf3198SRaphael Gault BUFFERED_PROGRAM_SETUP, 110*25cf3198SRaphael Gault BUFFER_WRITE, 111*25cf3198SRaphael Gault ERASE_BLOCK_SETUP, 112*25cf3198SRaphael Gault }; 113*25cf3198SRaphael Gault 114*25cf3198SRaphael Gault /* 115*25cf3198SRaphael Gault * The device can be in several **Read** modes. 116*25cf3198SRaphael Gault * We don't implement the asynchronous burst mode. 117*25cf3198SRaphael Gault */ 118*25cf3198SRaphael Gault enum cfi_read_mode { 119*25cf3198SRaphael Gault READ_ARRAY, 120*25cf3198SRaphael Gault READ_STATUS_REG, 121*25cf3198SRaphael Gault READ_JEDEC_DEVID, 122*25cf3198SRaphael Gault READ_CFI_QUERY, 123*25cf3198SRaphael Gault }; 124*25cf3198SRaphael Gault 125*25cf3198SRaphael Gault struct cfi_flash_device { 126*25cf3198SRaphael Gault struct device_header dev_hdr; 127*25cf3198SRaphael Gault /* Protects the CFI state machine variables in this data structure. */ 128*25cf3198SRaphael Gault struct mutex mutex; 129*25cf3198SRaphael Gault u64 base_addr; 130*25cf3198SRaphael Gault u32 size; 131*25cf3198SRaphael Gault 132*25cf3198SRaphael Gault void *flash_memory; 133*25cf3198SRaphael Gault u8 program_buffer[PROGRAM_BUFF_SIZE]; 134*25cf3198SRaphael Gault unsigned long *lock_bm; 135*25cf3198SRaphael Gault u64 block_address; 136*25cf3198SRaphael Gault unsigned int buff_written; 137*25cf3198SRaphael Gault unsigned int buffer_length; 138*25cf3198SRaphael Gault 139*25cf3198SRaphael Gault enum cfi_flash_state state; 140*25cf3198SRaphael Gault enum cfi_read_mode read_mode; 141*25cf3198SRaphael Gault u8 sr; 142*25cf3198SRaphael Gault }; 143*25cf3198SRaphael Gault 144*25cf3198SRaphael Gault static int nr_erase_blocks(struct cfi_flash_device *sfdev) 145*25cf3198SRaphael Gault { 146*25cf3198SRaphael Gault return sfdev->size / FLASH_BLOCK_SIZE; 147*25cf3198SRaphael Gault } 148*25cf3198SRaphael Gault 149*25cf3198SRaphael Gault /* 150*25cf3198SRaphael Gault * CFI queries always deal with one byte of information, possibly mirrored 151*25cf3198SRaphael Gault * to other bytes on the bus. This is dealt with in the callers. 152*25cf3198SRaphael Gault * The address provided is the one for 8-bit addressing, and would need to 153*25cf3198SRaphael Gault * be adjusted for wider accesses. 154*25cf3198SRaphael Gault */ 155*25cf3198SRaphael Gault static u8 read_cfi(struct cfi_flash_device *sfdev, u64 faddr) 156*25cf3198SRaphael Gault { 157*25cf3198SRaphael Gault if (faddr > sizeof(cfi_query_table)) { 158*25cf3198SRaphael Gault pr_debug("CFI query read access beyond the end of table"); 159*25cf3198SRaphael Gault return 0; 160*25cf3198SRaphael Gault } 161*25cf3198SRaphael Gault 162*25cf3198SRaphael Gault /* Fixup dynamic information in the geometry part of the table. */ 163*25cf3198SRaphael Gault switch (faddr) { 164*25cf3198SRaphael Gault case 0x27: /* device size in bytes, power of two */ 165*25cf3198SRaphael Gault return pow2_size(sfdev->size / CFI_NR_FLASH_CHIPS); 166*25cf3198SRaphael Gault case 0x2d + 0: /* number of erase blocks, minus one */ 167*25cf3198SRaphael Gault return (nr_erase_blocks(sfdev) - 1) & 0xff; 168*25cf3198SRaphael Gault case 0x2d + 1: 169*25cf3198SRaphael Gault return ((nr_erase_blocks(sfdev) - 1) >> 8) & 0xff; 170*25cf3198SRaphael Gault case 0x2d + 2: /* erase block size, in units of 256 */ 171*25cf3198SRaphael Gault return (FLASH_BLOCK_SIZE_PER_CHIP / 256) & 0xff; 172*25cf3198SRaphael Gault case 0x2d + 3: 173*25cf3198SRaphael Gault return ((FLASH_BLOCK_SIZE_PER_CHIP / 256) >> 8) & 0xff; 174*25cf3198SRaphael Gault } 175*25cf3198SRaphael Gault 176*25cf3198SRaphael Gault return cfi_query_table[faddr]; 177*25cf3198SRaphael Gault } 178*25cf3198SRaphael Gault 179*25cf3198SRaphael Gault static bool block_is_locked(struct cfi_flash_device *sfdev, u64 faddr) 180*25cf3198SRaphael Gault { 181*25cf3198SRaphael Gault int block_nr = faddr / FLASH_BLOCK_SIZE; 182*25cf3198SRaphael Gault 183*25cf3198SRaphael Gault return test_bit(block_nr, sfdev->lock_bm); 184*25cf3198SRaphael Gault } 185*25cf3198SRaphael Gault 186*25cf3198SRaphael Gault #define DEV_ID_MASK 0x7ff 187*25cf3198SRaphael Gault static u16 read_dev_id(struct cfi_flash_device *sfdev, u64 faddr) 188*25cf3198SRaphael Gault { 189*25cf3198SRaphael Gault switch ((faddr & DEV_ID_MASK) / CFI_BUS_WIDTH) { 190*25cf3198SRaphael Gault case 0x0: /* vendor ID */ 191*25cf3198SRaphael Gault return 0x0000; 192*25cf3198SRaphael Gault case 0x1: /* device ID */ 193*25cf3198SRaphael Gault return 0xffff; 194*25cf3198SRaphael Gault case 0x2: 195*25cf3198SRaphael Gault return block_is_locked(sfdev, faddr & ~DEV_ID_MASK); 196*25cf3198SRaphael Gault default: /* Ignore the other entries. */ 197*25cf3198SRaphael Gault return 0; 198*25cf3198SRaphael Gault } 199*25cf3198SRaphael Gault } 200*25cf3198SRaphael Gault 201*25cf3198SRaphael Gault static void lock_block(struct cfi_flash_device *sfdev, u64 faddr, bool lock) 202*25cf3198SRaphael Gault { 203*25cf3198SRaphael Gault int block_nr = faddr / FLASH_BLOCK_SIZE; 204*25cf3198SRaphael Gault 205*25cf3198SRaphael Gault if (lock) 206*25cf3198SRaphael Gault set_bit(block_nr, sfdev->lock_bm); 207*25cf3198SRaphael Gault else 208*25cf3198SRaphael Gault clear_bit(block_nr, sfdev->lock_bm); 209*25cf3198SRaphael Gault } 210*25cf3198SRaphael Gault 211*25cf3198SRaphael Gault static void word_program(struct cfi_flash_device *sfdev, 212*25cf3198SRaphael Gault u64 faddr, void *data, int len) 213*25cf3198SRaphael Gault { 214*25cf3198SRaphael Gault if (block_is_locked(sfdev, faddr)) { 215*25cf3198SRaphael Gault sfdev->sr |= CFI_STATUS_LOCK_ERROR; 216*25cf3198SRaphael Gault return; 217*25cf3198SRaphael Gault } 218*25cf3198SRaphael Gault 219*25cf3198SRaphael Gault memcpy(sfdev->flash_memory + faddr, data, len); 220*25cf3198SRaphael Gault } 221*25cf3198SRaphael Gault 222*25cf3198SRaphael Gault /* Reset the program buffer state to prepare for follow-up writes. */ 223*25cf3198SRaphael Gault static void buffer_setup(struct cfi_flash_device *sfdev) 224*25cf3198SRaphael Gault { 225*25cf3198SRaphael Gault memset(sfdev->program_buffer, 0, sizeof(sfdev->program_buffer)); 226*25cf3198SRaphael Gault sfdev->block_address = ~0ULL; 227*25cf3198SRaphael Gault sfdev->buff_written = 0; 228*25cf3198SRaphael Gault } 229*25cf3198SRaphael Gault 230*25cf3198SRaphael Gault static bool buffer_write(struct cfi_flash_device *sfdev, 231*25cf3198SRaphael Gault u64 faddr, void *buffer, int len) 232*25cf3198SRaphael Gault { 233*25cf3198SRaphael Gault unsigned int buff_addr; 234*25cf3198SRaphael Gault 235*25cf3198SRaphael Gault if (sfdev->buff_written >= sfdev->buffer_length) 236*25cf3198SRaphael Gault return false; 237*25cf3198SRaphael Gault 238*25cf3198SRaphael Gault /* 239*25cf3198SRaphael Gault * The first word written into the buffer after the setup command 240*25cf3198SRaphael Gault * happens to be the base address for the buffer. 241*25cf3198SRaphael Gault * All subsequent writes need to be within this address and this 242*25cf3198SRaphael Gault * address plus the buffer size, so keep this value around. 243*25cf3198SRaphael Gault */ 244*25cf3198SRaphael Gault if (sfdev->block_address == ~0ULL) 245*25cf3198SRaphael Gault sfdev->block_address = faddr; 246*25cf3198SRaphael Gault 247*25cf3198SRaphael Gault if (faddr < sfdev->block_address) 248*25cf3198SRaphael Gault return false; 249*25cf3198SRaphael Gault buff_addr = faddr - sfdev->block_address; 250*25cf3198SRaphael Gault if (buff_addr >= PROGRAM_BUFF_SIZE) 251*25cf3198SRaphael Gault return false; 252*25cf3198SRaphael Gault 253*25cf3198SRaphael Gault memcpy(sfdev->program_buffer + buff_addr, buffer, len); 254*25cf3198SRaphael Gault sfdev->buff_written += len; 255*25cf3198SRaphael Gault 256*25cf3198SRaphael Gault return true; 257*25cf3198SRaphael Gault } 258*25cf3198SRaphael Gault 259*25cf3198SRaphael Gault static void buffer_confirm(struct cfi_flash_device *sfdev) 260*25cf3198SRaphael Gault { 261*25cf3198SRaphael Gault if (block_is_locked(sfdev, sfdev->block_address)) { 262*25cf3198SRaphael Gault sfdev->sr |= CFI_STATUS_LOCK_ERROR; 263*25cf3198SRaphael Gault return; 264*25cf3198SRaphael Gault } 265*25cf3198SRaphael Gault memcpy(sfdev->flash_memory + sfdev->block_address, 266*25cf3198SRaphael Gault sfdev->program_buffer, sfdev->buff_written); 267*25cf3198SRaphael Gault } 268*25cf3198SRaphael Gault 269*25cf3198SRaphael Gault static void block_erase_confirm(struct cfi_flash_device *sfdev, u64 faddr) 270*25cf3198SRaphael Gault { 271*25cf3198SRaphael Gault if (block_is_locked(sfdev, faddr)) { 272*25cf3198SRaphael Gault sfdev->sr |= CFI_STATUS_LOCK_ERROR; 273*25cf3198SRaphael Gault return; 274*25cf3198SRaphael Gault } 275*25cf3198SRaphael Gault 276*25cf3198SRaphael Gault memset(sfdev->flash_memory + faddr, 0xff, FLASH_BLOCK_SIZE); 277*25cf3198SRaphael Gault } 278*25cf3198SRaphael Gault 279*25cf3198SRaphael Gault static void cfi_flash_read(struct cfi_flash_device *sfdev, 280*25cf3198SRaphael Gault u64 faddr, u8 *data, u32 len) 281*25cf3198SRaphael Gault { 282*25cf3198SRaphael Gault u16 cfi_value = 0; 283*25cf3198SRaphael Gault 284*25cf3198SRaphael Gault switch (sfdev->read_mode) { 285*25cf3198SRaphael Gault case READ_ARRAY: 286*25cf3198SRaphael Gault /* just copy the requested bytes from the array */ 287*25cf3198SRaphael Gault memcpy(data, sfdev->flash_memory + faddr, len); 288*25cf3198SRaphael Gault return; 289*25cf3198SRaphael Gault case READ_STATUS_REG: 290*25cf3198SRaphael Gault cfi_value = sfdev->sr; 291*25cf3198SRaphael Gault break; 292*25cf3198SRaphael Gault case READ_JEDEC_DEVID: 293*25cf3198SRaphael Gault cfi_value = read_dev_id(sfdev, faddr); 294*25cf3198SRaphael Gault break; 295*25cf3198SRaphael Gault case READ_CFI_QUERY: 296*25cf3198SRaphael Gault cfi_value = read_cfi(sfdev, faddr / CFI_BUS_WIDTH); 297*25cf3198SRaphael Gault break; 298*25cf3198SRaphael Gault } 299*25cf3198SRaphael Gault switch (len) { 300*25cf3198SRaphael Gault case 1: 301*25cf3198SRaphael Gault *data = cfi_value; 302*25cf3198SRaphael Gault break; 303*25cf3198SRaphael Gault case 8: memset(data + 4, 0, 4); 304*25cf3198SRaphael Gault /* fall-through */ 305*25cf3198SRaphael Gault case 4: 306*25cf3198SRaphael Gault if (CFI_NR_FLASH_CHIPS == 2) 307*25cf3198SRaphael Gault memcpy(data + 2, &cfi_value, 2); 308*25cf3198SRaphael Gault else 309*25cf3198SRaphael Gault memset(data + 2, 0, 2); 310*25cf3198SRaphael Gault /* fall-through */ 311*25cf3198SRaphael Gault case 2: 312*25cf3198SRaphael Gault memcpy(data, &cfi_value, 2); 313*25cf3198SRaphael Gault break; 314*25cf3198SRaphael Gault default: 315*25cf3198SRaphael Gault pr_debug("CFI flash: illegal access length %d for read mode %d", 316*25cf3198SRaphael Gault len, sfdev->read_mode); 317*25cf3198SRaphael Gault break; 318*25cf3198SRaphael Gault } 319*25cf3198SRaphael Gault } 320*25cf3198SRaphael Gault 321*25cf3198SRaphael Gault /* 322*25cf3198SRaphael Gault * Any writes happening in "READY" state don't actually write to the memory, 323*25cf3198SRaphael Gault * but are really treated as commands to advance the state machine and select 324*25cf3198SRaphael Gault * the next action. 325*25cf3198SRaphael Gault * Change the state and modes according to the value written. The address 326*25cf3198SRaphael Gault * that value is written to does not matter and is ignored. 327*25cf3198SRaphael Gault */ 328*25cf3198SRaphael Gault static void cfi_flash_write_ready(struct cfi_flash_device *sfdev, u8 command) 329*25cf3198SRaphael Gault { 330*25cf3198SRaphael Gault switch (command) { 331*25cf3198SRaphael Gault case CFI_CMD_READ_JEDEC_DEVID: 332*25cf3198SRaphael Gault sfdev->read_mode = READ_JEDEC_DEVID; 333*25cf3198SRaphael Gault break; 334*25cf3198SRaphael Gault case CFI_CMD_READ_STATUS_REG: 335*25cf3198SRaphael Gault sfdev->read_mode = READ_STATUS_REG; 336*25cf3198SRaphael Gault break; 337*25cf3198SRaphael Gault case CFI_CMD_READ_CFI_QUERY: 338*25cf3198SRaphael Gault sfdev->read_mode = READ_CFI_QUERY; 339*25cf3198SRaphael Gault break; 340*25cf3198SRaphael Gault case CFI_CMD_CLEAR_STATUS_REG: 341*25cf3198SRaphael Gault sfdev->sr = CFI_STATUS_READY; 342*25cf3198SRaphael Gault break; 343*25cf3198SRaphael Gault case CFI_CMD_WORD_PROGRAM: 344*25cf3198SRaphael Gault case CFI_CMD_ALTERNATE_WORD_PROGRAM: 345*25cf3198SRaphael Gault sfdev->state = WORD_PROGRAM; 346*25cf3198SRaphael Gault sfdev->read_mode = READ_STATUS_REG; 347*25cf3198SRaphael Gault break; 348*25cf3198SRaphael Gault case CFI_CMD_LOCK_BLOCK_SETUP: 349*25cf3198SRaphael Gault sfdev->state = LOCK_BLOCK_SETUP; 350*25cf3198SRaphael Gault break; 351*25cf3198SRaphael Gault case CFI_CMD_ERASE_BLOCK_SETUP: 352*25cf3198SRaphael Gault sfdev->state = ERASE_BLOCK_SETUP; 353*25cf3198SRaphael Gault sfdev->read_mode = READ_STATUS_REG; 354*25cf3198SRaphael Gault break; 355*25cf3198SRaphael Gault case CFI_CMD_BUFFERED_PROGRAM_SETUP: 356*25cf3198SRaphael Gault buffer_setup(sfdev); 357*25cf3198SRaphael Gault sfdev->state = BUFFERED_PROGRAM_SETUP; 358*25cf3198SRaphael Gault sfdev->read_mode = READ_STATUS_REG; 359*25cf3198SRaphael Gault break; 360*25cf3198SRaphael Gault case CFI_CMD_CONFIRM: 361*25cf3198SRaphael Gault pr_debug("CFI flash: unexpected confirm command 0xd0"); 362*25cf3198SRaphael Gault break; 363*25cf3198SRaphael Gault default: 364*25cf3198SRaphael Gault pr_debug("CFI flash: unknown command 0x%x", command); 365*25cf3198SRaphael Gault /* fall-through */ 366*25cf3198SRaphael Gault case CFI_CMD_READ_ARRAY: 367*25cf3198SRaphael Gault sfdev->read_mode = READ_ARRAY; 368*25cf3198SRaphael Gault break; 369*25cf3198SRaphael Gault } 370*25cf3198SRaphael Gault } 371*25cf3198SRaphael Gault 372*25cf3198SRaphael Gault static void cfi_flash_write(struct cfi_flash_device *sfdev, u16 command, 373*25cf3198SRaphael Gault u64 faddr, u8 *data, u32 len) 374*25cf3198SRaphael Gault { 375*25cf3198SRaphael Gault switch (sfdev->state) { 376*25cf3198SRaphael Gault case READY: 377*25cf3198SRaphael Gault cfi_flash_write_ready(sfdev, command & 0xff); 378*25cf3198SRaphael Gault return; 379*25cf3198SRaphael Gault case LOCK_BLOCK_SETUP: 380*25cf3198SRaphael Gault switch (command & 0xff) { 381*25cf3198SRaphael Gault case CFI_CMD_LOCK_BLOCK: 382*25cf3198SRaphael Gault lock_block(sfdev, faddr, true); 383*25cf3198SRaphael Gault sfdev->read_mode = READ_STATUS_REG; 384*25cf3198SRaphael Gault break; 385*25cf3198SRaphael Gault case CFI_CMD_CONFIRM: 386*25cf3198SRaphael Gault lock_block(sfdev, faddr, false); 387*25cf3198SRaphael Gault sfdev->read_mode = READ_STATUS_REG; 388*25cf3198SRaphael Gault break; 389*25cf3198SRaphael Gault default: 390*25cf3198SRaphael Gault sfdev->sr |= CFI_STATUS_ERASE_ERROR; 391*25cf3198SRaphael Gault break; 392*25cf3198SRaphael Gault } 393*25cf3198SRaphael Gault sfdev->state = READY; 394*25cf3198SRaphael Gault break; 395*25cf3198SRaphael Gault 396*25cf3198SRaphael Gault case WORD_PROGRAM: 397*25cf3198SRaphael Gault word_program(sfdev, faddr, data, len); 398*25cf3198SRaphael Gault sfdev->read_mode = READ_STATUS_REG; 399*25cf3198SRaphael Gault sfdev->state = READY; 400*25cf3198SRaphael Gault break; 401*25cf3198SRaphael Gault 402*25cf3198SRaphael Gault case BUFFER_WRITE: 403*25cf3198SRaphael Gault if (buffer_write(sfdev, faddr, data, len)) 404*25cf3198SRaphael Gault break; 405*25cf3198SRaphael Gault 406*25cf3198SRaphael Gault if ((command & 0xff) == CFI_CMD_CONFIRM) { 407*25cf3198SRaphael Gault buffer_confirm(sfdev); 408*25cf3198SRaphael Gault sfdev->read_mode = READ_STATUS_REG; 409*25cf3198SRaphael Gault } else { 410*25cf3198SRaphael Gault pr_debug("CFI flash: BUFFER_WRITE: expected CONFIRM(0xd0), got 0x%x @ 0x%llx", 411*25cf3198SRaphael Gault command, faddr); 412*25cf3198SRaphael Gault sfdev->sr |= CFI_STATUS_PROGRAM_LOCK_BIT; 413*25cf3198SRaphael Gault } 414*25cf3198SRaphael Gault sfdev->state = READY; 415*25cf3198SRaphael Gault break; 416*25cf3198SRaphael Gault 417*25cf3198SRaphael Gault case BUFFERED_PROGRAM_SETUP: 418*25cf3198SRaphael Gault sfdev->buffer_length = (command + 1) * CFI_BUS_WIDTH; 419*25cf3198SRaphael Gault if (sfdev->buffer_length > PROGRAM_BUFF_SIZE) 420*25cf3198SRaphael Gault sfdev->buffer_length = PROGRAM_BUFF_SIZE; 421*25cf3198SRaphael Gault sfdev->state = BUFFER_WRITE; 422*25cf3198SRaphael Gault sfdev->read_mode = READ_STATUS_REG; 423*25cf3198SRaphael Gault break; 424*25cf3198SRaphael Gault 425*25cf3198SRaphael Gault case ERASE_BLOCK_SETUP: 426*25cf3198SRaphael Gault if ((command & 0xff) == CFI_CMD_CONFIRM) 427*25cf3198SRaphael Gault block_erase_confirm(sfdev, faddr); 428*25cf3198SRaphael Gault else 429*25cf3198SRaphael Gault sfdev->sr |= CFI_STATUS_ERASE_ERROR; 430*25cf3198SRaphael Gault 431*25cf3198SRaphael Gault sfdev->state = READY; 432*25cf3198SRaphael Gault sfdev->read_mode = READ_STATUS_REG; 433*25cf3198SRaphael Gault break; 434*25cf3198SRaphael Gault default: 435*25cf3198SRaphael Gault pr_debug("CFI flash: unexpected/unknown command 0x%x", command); 436*25cf3198SRaphael Gault break; 437*25cf3198SRaphael Gault } 438*25cf3198SRaphael Gault } 439*25cf3198SRaphael Gault 440*25cf3198SRaphael Gault static void cfi_flash_mmio(struct kvm_cpu *vcpu, 441*25cf3198SRaphael Gault u64 addr, u8 *data, u32 len, u8 is_write, 442*25cf3198SRaphael Gault void *context) 443*25cf3198SRaphael Gault { 444*25cf3198SRaphael Gault struct cfi_flash_device *sfdev = context; 445*25cf3198SRaphael Gault u64 faddr = addr - sfdev->base_addr; 446*25cf3198SRaphael Gault u32 value; 447*25cf3198SRaphael Gault 448*25cf3198SRaphael Gault if (!is_write) { 449*25cf3198SRaphael Gault mutex_lock(&sfdev->mutex); 450*25cf3198SRaphael Gault 451*25cf3198SRaphael Gault cfi_flash_read(sfdev, faddr, data, len); 452*25cf3198SRaphael Gault 453*25cf3198SRaphael Gault mutex_unlock(&sfdev->mutex); 454*25cf3198SRaphael Gault 455*25cf3198SRaphael Gault return; 456*25cf3198SRaphael Gault } 457*25cf3198SRaphael Gault 458*25cf3198SRaphael Gault if (len > 4) { 459*25cf3198SRaphael Gault pr_info("CFI flash: MMIO %d-bit write access not supported", 460*25cf3198SRaphael Gault len * 8); 461*25cf3198SRaphael Gault return; 462*25cf3198SRaphael Gault } 463*25cf3198SRaphael Gault 464*25cf3198SRaphael Gault memcpy(&value, data, len); 465*25cf3198SRaphael Gault 466*25cf3198SRaphael Gault mutex_lock(&sfdev->mutex); 467*25cf3198SRaphael Gault 468*25cf3198SRaphael Gault cfi_flash_write(sfdev, value & 0xffff, faddr, data, len); 469*25cf3198SRaphael Gault 470*25cf3198SRaphael Gault mutex_unlock(&sfdev->mutex); 471*25cf3198SRaphael Gault } 472*25cf3198SRaphael Gault 473*25cf3198SRaphael Gault #ifdef CONFIG_HAS_LIBFDT 474*25cf3198SRaphael Gault static void generate_cfi_flash_fdt_node(void *fdt, 475*25cf3198SRaphael Gault struct device_header *dev_hdr, 476*25cf3198SRaphael Gault void (*generate_irq_prop)(void *fdt, 477*25cf3198SRaphael Gault u8 irq, 478*25cf3198SRaphael Gault enum irq_type)) 479*25cf3198SRaphael Gault { 480*25cf3198SRaphael Gault struct cfi_flash_device *sfdev; 481*25cf3198SRaphael Gault u64 reg_prop[2]; 482*25cf3198SRaphael Gault 483*25cf3198SRaphael Gault sfdev = container_of(dev_hdr, struct cfi_flash_device, dev_hdr); 484*25cf3198SRaphael Gault reg_prop[0] = cpu_to_fdt64(sfdev->base_addr); 485*25cf3198SRaphael Gault reg_prop[1] = cpu_to_fdt64(sfdev->size); 486*25cf3198SRaphael Gault 487*25cf3198SRaphael Gault _FDT(fdt_begin_node(fdt, "flash")); 488*25cf3198SRaphael Gault _FDT(fdt_property_cell(fdt, "bank-width", CFI_BUS_WIDTH)); 489*25cf3198SRaphael Gault _FDT(fdt_property_cell(fdt, "#address-cells", 0x1)); 490*25cf3198SRaphael Gault _FDT(fdt_property_cell(fdt, "#size-cells", 0x1)); 491*25cf3198SRaphael Gault _FDT(fdt_property_string(fdt, "compatible", "cfi-flash")); 492*25cf3198SRaphael Gault _FDT(fdt_property_string(fdt, "label", "System-firmware")); 493*25cf3198SRaphael Gault _FDT(fdt_property(fdt, "reg", ®_prop, sizeof(reg_prop))); 494*25cf3198SRaphael Gault _FDT(fdt_end_node(fdt)); 495*25cf3198SRaphael Gault } 496*25cf3198SRaphael Gault #else 497*25cf3198SRaphael Gault #define generate_cfi_flash_fdt_node NULL 498*25cf3198SRaphael Gault #endif 499*25cf3198SRaphael Gault 500*25cf3198SRaphael Gault static struct cfi_flash_device *create_flash_device_file(struct kvm *kvm, 501*25cf3198SRaphael Gault const char *filename) 502*25cf3198SRaphael Gault { 503*25cf3198SRaphael Gault struct cfi_flash_device *sfdev; 504*25cf3198SRaphael Gault struct stat statbuf; 505*25cf3198SRaphael Gault unsigned int value; 506*25cf3198SRaphael Gault int ret; 507*25cf3198SRaphael Gault int fd; 508*25cf3198SRaphael Gault 509*25cf3198SRaphael Gault fd = open(filename, O_RDWR); 510*25cf3198SRaphael Gault if (fd < 0) 511*25cf3198SRaphael Gault return ERR_PTR(-errno); 512*25cf3198SRaphael Gault 513*25cf3198SRaphael Gault if (fstat(fd, &statbuf) < 0) { 514*25cf3198SRaphael Gault ret = -errno; 515*25cf3198SRaphael Gault goto out_close; 516*25cf3198SRaphael Gault } 517*25cf3198SRaphael Gault 518*25cf3198SRaphael Gault sfdev = malloc(sizeof(struct cfi_flash_device)); 519*25cf3198SRaphael Gault if (!sfdev) { 520*25cf3198SRaphael Gault ret = -ENOMEM; 521*25cf3198SRaphael Gault goto out_close; 522*25cf3198SRaphael Gault } 523*25cf3198SRaphael Gault 524*25cf3198SRaphael Gault sfdev->size = statbuf.st_size; 525*25cf3198SRaphael Gault /* Round down to nearest power-of-2 size value. */ 526*25cf3198SRaphael Gault sfdev->size = 1U << (pow2_size(sfdev->size + 1) - 1); 527*25cf3198SRaphael Gault if (sfdev->size > KVM_FLASH_MAX_SIZE) 528*25cf3198SRaphael Gault sfdev->size = KVM_FLASH_MAX_SIZE; 529*25cf3198SRaphael Gault if (sfdev->size < statbuf.st_size) { 530*25cf3198SRaphael Gault pr_info("flash file size (%llu bytes) is not a power of two", 531*25cf3198SRaphael Gault (unsigned long long)statbuf.st_size); 532*25cf3198SRaphael Gault pr_info("only using first %u bytes", sfdev->size); 533*25cf3198SRaphael Gault } 534*25cf3198SRaphael Gault sfdev->flash_memory = mmap(NULL, sfdev->size, 535*25cf3198SRaphael Gault PROT_READ | PROT_WRITE, MAP_SHARED, 536*25cf3198SRaphael Gault fd, 0); 537*25cf3198SRaphael Gault if (sfdev->flash_memory == MAP_FAILED) { 538*25cf3198SRaphael Gault ret = -errno; 539*25cf3198SRaphael Gault goto out_free; 540*25cf3198SRaphael Gault } 541*25cf3198SRaphael Gault sfdev->base_addr = KVM_FLASH_MMIO_BASE; 542*25cf3198SRaphael Gault sfdev->state = READY; 543*25cf3198SRaphael Gault sfdev->read_mode = READ_ARRAY; 544*25cf3198SRaphael Gault sfdev->sr = CFI_STATUS_READY; 545*25cf3198SRaphael Gault 546*25cf3198SRaphael Gault value = roundup(nr_erase_blocks(sfdev), BITS_PER_LONG) / 8; 547*25cf3198SRaphael Gault sfdev->lock_bm = malloc(value); 548*25cf3198SRaphael Gault memset(sfdev->lock_bm, 0, value); 549*25cf3198SRaphael Gault 550*25cf3198SRaphael Gault sfdev->dev_hdr.bus_type = DEVICE_BUS_MMIO; 551*25cf3198SRaphael Gault sfdev->dev_hdr.data = generate_cfi_flash_fdt_node; 552*25cf3198SRaphael Gault mutex_init(&sfdev->mutex); 553*25cf3198SRaphael Gault ret = device__register(&sfdev->dev_hdr); 554*25cf3198SRaphael Gault if (ret) 555*25cf3198SRaphael Gault goto out_unmap; 556*25cf3198SRaphael Gault 557*25cf3198SRaphael Gault ret = kvm__register_mmio(kvm, 558*25cf3198SRaphael Gault sfdev->base_addr, sfdev->size, 559*25cf3198SRaphael Gault false, cfi_flash_mmio, sfdev); 560*25cf3198SRaphael Gault if (ret) { 561*25cf3198SRaphael Gault device__unregister(&sfdev->dev_hdr); 562*25cf3198SRaphael Gault goto out_unmap; 563*25cf3198SRaphael Gault } 564*25cf3198SRaphael Gault 565*25cf3198SRaphael Gault return sfdev; 566*25cf3198SRaphael Gault 567*25cf3198SRaphael Gault out_unmap: 568*25cf3198SRaphael Gault munmap(sfdev->flash_memory, sfdev->size); 569*25cf3198SRaphael Gault out_free: 570*25cf3198SRaphael Gault free(sfdev); 571*25cf3198SRaphael Gault out_close: 572*25cf3198SRaphael Gault close(fd); 573*25cf3198SRaphael Gault 574*25cf3198SRaphael Gault return ERR_PTR(ret); 575*25cf3198SRaphael Gault } 576*25cf3198SRaphael Gault 577*25cf3198SRaphael Gault static int cfi_flash__init(struct kvm *kvm) 578*25cf3198SRaphael Gault { 579*25cf3198SRaphael Gault struct cfi_flash_device *sfdev; 580*25cf3198SRaphael Gault 581*25cf3198SRaphael Gault BUILD_BUG_ON(CFI_NR_FLASH_CHIPS != 1 && CFI_NR_FLASH_CHIPS != 2); 582*25cf3198SRaphael Gault 583*25cf3198SRaphael Gault if (!kvm->cfg.flash_filename) 584*25cf3198SRaphael Gault return 0; 585*25cf3198SRaphael Gault 586*25cf3198SRaphael Gault sfdev = create_flash_device_file(kvm, kvm->cfg.flash_filename); 587*25cf3198SRaphael Gault if (IS_ERR(sfdev)) 588*25cf3198SRaphael Gault return PTR_ERR(sfdev); 589*25cf3198SRaphael Gault 590*25cf3198SRaphael Gault return 0; 591*25cf3198SRaphael Gault } 592*25cf3198SRaphael Gault dev_init(cfi_flash__init); 593