2 * Copyright (c) 2011 The Chromium OS Authors.
3 * Copyright (C) 2009, 2010 Carl-Daniel Hailfinger
4 * Copyright (C) 2011 Stefan Tauner
5 * Copyright (C) 2018 Siemens AG
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License as
9 * published by the Free Software Foundation; either version 2 of
10 * the License, or (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but without any warranty; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
18 #define __SIMPLE_DEVICE__
20 /* This file is derived from the flashrom project. */
24 #include <bootstate.h>
25 #include <commonlib/helpers.h>
27 #include <device/mmio.h>
28 #include <device/pci_ops.h>
29 #include <console/console.h>
30 #include <device/device.h>
31 #include <device/pci.h>
32 #include <spi_flash.h>
33 #include <spi-generic.h>
37 #define HSFC_FCYCLE_OFF 1 /* 1-2: FLASH Cycle */
38 #define HSFC_FCYCLE (0x3 << HSFC_FCYCLE_OFF)
39 #define HSFC_FDBC_OFF 8 /* 8-13: Flash Data Byte Count */
40 #define HSFC_FDBC (0x3f << HSFC_FDBC_OFF)
42 static int spi_is_multichip(void);
44 struct ich7_spi_regs
{
57 struct ich9_spi_regs
{
66 uint32_t _reserved1
[3];
68 uint32_t _reserved2
[2];
75 uint8_t _reserved3
[12];
78 uint8_t _reserved4
[8];
82 uint8_t _reserved5
[4];
84 uint8_t _reserved6
[28];
90 struct ich_spi_controller
{
97 struct ich9_spi_regs
*ich9_spi
;
98 struct ich7_spi_regs
*ich7_spi
;
106 unsigned int databytes
;
114 static struct ich_spi_controller cntlr
;
123 SPIS_RESERVED_MASK
= 0x7ff0,
124 SSFS_RESERVED_MASK
= 0x7fe2
128 SPIC_SCGO
= 0x000002,
130 SPIC_SPOP
= 0x000008,
134 SSFC_SCF_MASK
= 0x070000,
135 SSFC_RESERVED
= 0xf80000
142 HSFS_BERASE_MASK
= 0x0018,
143 HSFS_BERASE_SHIFT
= 3,
145 HSFS_FDOPSS
= 0x2000,
147 HSFS_FLOCKDN
= 0x8000
152 HSFC_FCYCLE_MASK
= 0x0006,
153 HSFC_FCYCLE_SHIFT
= 1,
154 HSFC_FDBC_MASK
= 0x3f00,
160 SPI_OPCODE_TYPE_READ_NO_ADDRESS
= 0,
161 SPI_OPCODE_TYPE_WRITE_NO_ADDRESS
= 1,
162 SPI_OPCODE_TYPE_READ_WITH_ADDRESS
= 2,
163 SPI_OPCODE_TYPE_WRITE_WITH_ADDRESS
= 3
166 #if CONFIG(DEBUG_SPI_FLASH)
168 static u8
readb_(const void *addr
)
172 printk(BIOS_DEBUG
, "read %2.2x from %4.4x\n",
173 v
, ((unsigned int) addr
& 0xffff) - 0xf020);
177 static u16
readw_(const void *addr
)
179 u16 v
= read16(addr
);
181 printk(BIOS_DEBUG
, "read %4.4x from %4.4x\n",
182 v
, ((unsigned int) addr
& 0xffff) - 0xf020);
186 static u32
readl_(const void *addr
)
188 u32 v
= read32(addr
);
190 printk(BIOS_DEBUG
, "read %8.8x from %4.4x\n",
191 v
, ((unsigned int) addr
& 0xffff) - 0xf020);
195 static void writeb_(u8 b
, void *addr
)
198 printk(BIOS_DEBUG
, "wrote %2.2x to %4.4x\n",
199 b
, ((unsigned int) addr
& 0xffff) - 0xf020);
202 static void writew_(u16 b
, void *addr
)
205 printk(BIOS_DEBUG
, "wrote %4.4x to %4.4x\n",
206 b
, ((unsigned int) addr
& 0xffff) - 0xf020);
209 static void writel_(u32 b
, void *addr
)
212 printk(BIOS_DEBUG
, "wrote %8.8x to %4.4x\n",
213 b
, ((unsigned int) addr
& 0xffff) - 0xf020);
216 #else /* CONFIG_DEBUG_SPI_FLASH ^^^ enabled vvv NOT enabled */
218 #define readb_(a) read8(a)
219 #define readw_(a) read16(a)
220 #define readl_(a) read32(a)
221 #define writeb_(val, addr) write8(addr, val)
222 #define writew_(val, addr) write16(addr, val)
223 #define writel_(val, addr) write32(addr, val)
225 #endif /* CONFIG_DEBUG_SPI_FLASH ^^^ NOT enabled */
227 static void write_reg(const void *value
, void *dest
, uint32_t size
)
229 const uint8_t *bvalue
= value
;
230 uint8_t *bdest
= dest
;
233 writel_(*(const uint32_t *)bvalue
, bdest
);
234 bdest
+= 4; bvalue
+= 4; size
-= 4;
237 writeb_(*bvalue
, bdest
);
238 bdest
++; bvalue
++; size
--;
242 static void read_reg(const void *src
, void *value
, uint32_t size
)
244 const uint8_t *bsrc
= src
;
245 uint8_t *bvalue
= value
;
248 *(uint32_t *)bvalue
= readl_(bsrc
);
249 bsrc
+= 4; bvalue
+= 4; size
-= 4;
252 *bvalue
= readb_(bsrc
);
253 bsrc
++; bvalue
++; size
--;
257 static void ich_set_bbar(uint32_t minaddr
)
259 const uint32_t bbar_mask
= 0x00ffff00;
260 uint32_t ichspi_bbar
;
262 minaddr
&= bbar_mask
;
263 ichspi_bbar
= readl_(cntlr
.bbar
) & ~bbar_mask
;
264 ichspi_bbar
|= minaddr
;
265 writel_(ichspi_bbar
, cntlr
.bbar
);
268 #if CONFIG(SOUTHBRIDGE_INTEL_I82801GX)
269 #define MENU_BYTES member_size(struct ich7_spi_regs, opmenu)
271 #define MENU_BYTES member_size(struct ich9_spi_regs, opmenu)
277 static void *get_spi_bar(pci_devfn_t dev
)
279 uintptr_t rcba
; /* Root Complex Register Block */
282 if (CONFIG(SOUTHBRIDGE_INTEL_I82801GX
)) {
283 rcba
= pci_read_config32(dev
, RCBA
);
284 return (void *)((rcba
& 0xffffc000) + 0x3020);
286 if (CONFIG(SOUTHBRIDGE_INTEL_COMMON_SPI_SILVERMONT
)) {
287 sbase
= pci_read_config32(dev
, SBASE
);
289 return (void *)sbase
;
291 if (CONFIG(SOUTHBRIDGE_INTEL_COMMON_SPI_ICH9
)) {
292 rcba
= pci_read_config32(dev
, RCBA
);
293 return (void *)((rcba
& 0xffffc000) + 0x3800);
300 struct ich9_spi_regs
*ich9_spi
;
301 struct ich7_spi_regs
*ich7_spi
;
304 pci_devfn_t dev
= PCI_DEV(0, 31, 0);
306 if (CONFIG(SOUTHBRIDGE_INTEL_I82801GX
)) {
307 ich7_spi
= get_spi_bar(dev
);
308 cntlr
.ich7_spi
= ich7_spi
;
309 cntlr
.opmenu
= ich7_spi
->opmenu
;
310 cntlr
.menubytes
= sizeof(ich7_spi
->opmenu
);
311 cntlr
.optype
= &ich7_spi
->optype
;
312 cntlr
.addr
= &ich7_spi
->spia
;
313 cntlr
.data
= (uint8_t *)ich7_spi
->spid
;
314 cntlr
.databytes
= sizeof(ich7_spi
->spid
);
315 cntlr
.status
= (uint8_t *)&ich7_spi
->spis
;
316 cntlr
.control
= &ich7_spi
->spic
;
317 cntlr
.bbar
= &ich7_spi
->bbar
;
318 cntlr
.preop
= &ich7_spi
->preop
;
319 cntlr
.fpr
= &ich7_spi
->pbr
[0];
322 ich9_spi
= get_spi_bar(dev
);
323 cntlr
.ich9_spi
= ich9_spi
;
324 hsfs
= readw_(&ich9_spi
->hsfs
);
326 cntlr
.opmenu
= ich9_spi
->opmenu
;
327 cntlr
.menubytes
= sizeof(ich9_spi
->opmenu
);
328 cntlr
.optype
= &ich9_spi
->optype
;
329 cntlr
.addr
= &ich9_spi
->faddr
;
330 cntlr
.data
= (uint8_t *)ich9_spi
->fdata
;
331 cntlr
.databytes
= sizeof(ich9_spi
->fdata
);
332 cntlr
.status
= &ich9_spi
->ssfs
;
333 cntlr
.control
= (uint16_t *)ich9_spi
->ssfc
;
334 cntlr
.bbar
= &ich9_spi
->bbar
;
335 cntlr
.preop
= &ich9_spi
->preop
;
336 cntlr
.fpr
= &ich9_spi
->pr
[0];
339 if (cntlr
.hsfs
& HSFS_FDV
) {
340 writel_(4, &ich9_spi
->fdoc
);
341 cntlr
.flmap0
= readl_(&ich9_spi
->fdod
);
342 writel_(0x1000, &ich9_spi
->fdoc
);
343 cntlr
.flcomp
= readl_(&ich9_spi
->fdod
);
349 if (CONFIG(SOUTHBRIDGE_INTEL_I82801GX
) || CONFIG(SOUTHBRIDGE_INTEL_COMMON_SPI_ICH9
)) {
350 /* Disable the BIOS write protect so write commands are allowed. */
351 bios_cntl
= pci_read_config8(dev
, 0xdc);
352 /* Deassert SMM BIOS Write Protect Disable. */
353 bios_cntl
&= ~(1 << 5);
354 pci_write_config8(dev
, 0xdc, bios_cntl
| 0x1);
358 static int spi_locked(void)
360 if (CONFIG(SOUTHBRIDGE_INTEL_I82801GX
)) {
361 return !!(readw_(&cntlr
.ich7_spi
->spis
) & HSFS_FLOCKDN
);
363 return !!(readw_(&cntlr
.ich9_spi
->hsfs
) & HSFS_FLOCKDN
);
367 static void spi_init_cb(void *unused
)
372 BOOT_STATE_INIT_ENTRY(BS_DEV_INIT
, BS_ON_ENTRY
, spi_init_cb
, NULL
);
374 typedef struct spi_transaction
{
384 static inline void spi_use_out(spi_transaction
*trans
, unsigned int bytes
)
387 trans
->bytesout
-= bytes
;
390 static inline void spi_use_in(spi_transaction
*trans
, unsigned int bytes
)
393 trans
->bytesin
-= bytes
;
396 static void spi_setup_type(spi_transaction
*trans
)
400 /* Try to guess spi type from read/write sizes. */
401 if (trans
->bytesin
== 0) {
402 if (trans
->bytesout
> 4)
404 * If bytesin = 0 and bytesout > 4, we presume this is
405 * a write data operation, which is accompanied by an
408 trans
->type
= SPI_OPCODE_TYPE_WRITE_WITH_ADDRESS
;
410 trans
->type
= SPI_OPCODE_TYPE_WRITE_NO_ADDRESS
;
414 if (trans
->bytesout
== 1) { /* and bytesin is > 0 */
415 trans
->type
= SPI_OPCODE_TYPE_READ_NO_ADDRESS
;
419 if (trans
->bytesout
== 4) { /* and bytesin is > 0 */
420 trans
->type
= SPI_OPCODE_TYPE_READ_WITH_ADDRESS
;
423 /* Fast read command is called with 5 bytes instead of 4 */
424 if (trans
->out
[0] == SPI_OPCODE_FAST_READ
&& trans
->bytesout
== 5) {
425 trans
->type
= SPI_OPCODE_TYPE_READ_WITH_ADDRESS
;
430 static int spi_setup_opcode(spi_transaction
*trans
)
433 uint8_t opmenu
[MENU_BYTES
];
435 trans
->opcode
= trans
->out
[0];
436 spi_use_out(trans
, 1);
438 /* The lock is off, so just use index 0. */
439 writeb_(trans
->opcode
, cntlr
.opmenu
);
440 optypes
= readw_(cntlr
.optype
);
441 optypes
= (optypes
& 0xfffc) | (trans
->type
& 0x3);
442 writew_(optypes
, cntlr
.optype
);
446 /* The lock is on. See if what we need is on the menu. */
448 uint16_t opcode_index
;
450 /* Write Enable is handled as atomic prefix */
451 if (trans
->opcode
== SPI_OPCODE_WREN
)
454 read_reg(cntlr
.opmenu
, opmenu
, sizeof(opmenu
));
455 for (opcode_index
= 0; opcode_index
< ARRAY_SIZE(opmenu
); opcode_index
++) {
456 if (opmenu
[opcode_index
] == trans
->opcode
)
460 if (opcode_index
== ARRAY_SIZE(opmenu
)) {
461 printk(BIOS_DEBUG
, "ICH SPI: Opcode %x not found\n",
466 optypes
= readw_(cntlr
.optype
);
467 optype
= (optypes
>> (opcode_index
* 2)) & 0x3;
468 if (trans
->type
== SPI_OPCODE_TYPE_WRITE_NO_ADDRESS
&&
469 optype
== SPI_OPCODE_TYPE_WRITE_WITH_ADDRESS
&&
470 trans
->bytesout
>= 3) {
471 /* We guessed wrong earlier. Fix it up. */
472 trans
->type
= optype
;
474 if (optype
!= trans
->type
) {
475 printk(BIOS_DEBUG
, "ICH SPI: Transaction doesn't fit type %d\n",
482 static int spi_setup_offset(spi_transaction
*trans
)
484 /* Separate the SPI address and data. */
485 switch (trans
->type
) {
486 case SPI_OPCODE_TYPE_READ_NO_ADDRESS
:
487 case SPI_OPCODE_TYPE_WRITE_NO_ADDRESS
:
489 case SPI_OPCODE_TYPE_READ_WITH_ADDRESS
:
490 case SPI_OPCODE_TYPE_WRITE_WITH_ADDRESS
:
491 trans
->offset
= ((uint32_t)trans
->out
[0] << 16) |
492 ((uint32_t)trans
->out
[1] << 8) |
493 ((uint32_t)trans
->out
[2] << 0);
494 spi_use_out(trans
, 3);
497 printk(BIOS_DEBUG
, "Unrecognized SPI transaction type %#x\n", trans
->type
);
503 * Wait for up to 6s til status register bit(s) turn 1 (in case wait_til_set
504 * below is True) or 0. In case the wait was for the bit(s) to set - write
505 * those bits back, which would cause resetting them.
507 * Return the last read status value on success or -1 on failure.
509 static int ich_status_poll(u16 bitmask
, int wait_til_set
)
511 int timeout
= 600000; /* This will result in 6 seconds */
515 status
= readw_(cntlr
.status
);
516 if (wait_til_set
^ ((status
& bitmask
) == 0)) {
518 writew_((status
& bitmask
), cntlr
.status
);
524 printk(BIOS_DEBUG
, "ICH SPI: SCIP timeout, read %x, bitmask %x\n",
529 static int spi_is_multichip(void)
531 if (!(cntlr
.hsfs
& HSFS_FDV
))
533 return !!((cntlr
.flmap0
>> 8) & 3);
536 static int spi_ctrlr_xfer(const struct spi_slave
*slave
, const void *dout
,
537 size_t bytesout
, void *din
, size_t bytesin
)
540 int16_t opcode_index
;
544 spi_transaction trans
= {
550 /* There has to always at least be an opcode. */
551 if (!bytesout
|| !dout
) {
552 printk(BIOS_DEBUG
, "ICH SPI: No opcode for transfer\n");
555 /* Make sure if we read something we have a place to put it. */
556 if (bytesin
!= 0 && !din
) {
557 printk(BIOS_DEBUG
, "ICH SPI: Read but no target buffer\n");
561 if (ich_status_poll(SPIS_SCIP
, 0) == -1)
564 writew_(SPIS_CDS
| SPIS_FCERR
, cntlr
.status
);
566 spi_setup_type(&trans
);
567 if ((opcode_index
= spi_setup_opcode(&trans
)) < 0)
569 if ((with_address
= spi_setup_offset(&trans
)) < 0)
572 if (trans
.opcode
== SPI_OPCODE_WREN
) {
574 * Treat Write Enable as Atomic Pre-Op if possible
575 * in order to prevent the Management Engine from
576 * issuing a transaction between WREN and DATA.
579 writew_(trans
.opcode
, cntlr
.preop
);
583 /* Preset control fields */
584 control
= SPIC_SCGO
| ((opcode_index
& 0x07) << 4);
586 /* Issue atomic preop cycle if needed */
587 if (readw_(cntlr
.preop
))
590 if (!trans
.bytesout
&& !trans
.bytesin
) {
591 /* SPI addresses are 24 bit only */
593 writel_(trans
.offset
& 0x00FFFFFF, cntlr
.addr
);
596 * This is a 'no data' command (like Write Enable), its
597 * bitesout size was 1, decremented to zero while executing
598 * spi_setup_opcode() above. Tell the chip to send the
601 writew_(control
, cntlr
.control
);
603 /* wait for the result */
604 status
= ich_status_poll(SPIS_CDS
| SPIS_FCERR
, 1);
608 if (status
& SPIS_FCERR
) {
609 printk(BIOS_DEBUG
, "ICH SPI: Command transaction error\n");
617 * Check if this is a write command attempting to transfer more bytes
618 * than the controller can handle. Iterations for writes are not
619 * supported here because each SPI write command needs to be preceded
620 * and followed by other SPI commands, and this sequence is controlled
621 * by the SPI chip driver.
623 if (trans
.bytesout
> cntlr
.databytes
) {
624 printk(BIOS_DEBUG
, "ICH SPI: Too much to write. Does your SPI chip driver use"
625 " spi_crop_chunk()?\n");
630 * Read or write up to databytes bytes at a time until everything has
633 while (trans
.bytesout
|| trans
.bytesin
) {
634 uint32_t data_length
;
636 /* SPI addresses are 24 bit only */
637 writel_(trans
.offset
& 0x00FFFFFF, cntlr
.addr
);
640 data_length
= MIN(trans
.bytesout
, cntlr
.databytes
);
642 data_length
= MIN(trans
.bytesin
, cntlr
.databytes
);
644 /* Program data into FDATA0 to N */
645 if (trans
.bytesout
) {
646 write_reg(trans
.out
, cntlr
.data
, data_length
);
647 spi_use_out(&trans
, data_length
);
649 trans
.offset
+= data_length
;
652 /* Add proper control fields' values */
653 control
&= ~((cntlr
.databytes
- 1) << 8);
655 control
|= (data_length
- 1) << 8;
658 writew_(control
, cntlr
.control
);
660 /* Wait for Cycle Done Status or Flash Cycle Error. */
661 status
= ich_status_poll(SPIS_CDS
| SPIS_FCERR
, 1);
665 if (status
& SPIS_FCERR
) {
666 printk(BIOS_DEBUG
, "ICH SPI: Data transaction error\n");
671 read_reg(cntlr
.data
, trans
.in
, data_length
);
672 spi_use_in(&trans
, data_length
);
674 trans
.offset
+= data_length
;
679 /* Clear atomic preop now that xfer is done */
680 writew_(0, cntlr
.preop
);
685 /* Sets FLA in FADDR to (addr & 0x01FFFFFF) without touching other bits. */
686 static void ich_hwseq_set_addr(uint32_t addr
)
688 uint32_t addr_old
= readl_(&cntlr
.ich9_spi
->faddr
) & ~0x01FFFFFF;
690 writel_((addr
& 0x01FFFFFF) | addr_old
, &cntlr
.ich9_spi
->faddr
);
693 /* Polls for Cycle Done Status, Flash Cycle Error or timeout in 8 us intervals.
694 Resets all error flags in HSFS.
695 Returns 0 if the cycle completes successfully without errors within
696 timeout us, 1 on errors. */
697 static int ich_hwseq_wait_for_cycle_complete(unsigned int timeout
,
703 timeout
/= 8; /* scale timeout duration to counter */
704 while ((((hsfs
= readw_(&cntlr
.ich9_spi
->hsfs
)) &
705 (HSFS_FDONE
| HSFS_FCERR
)) == 0) &&
709 writew_(readw_(&cntlr
.ich9_spi
->hsfs
), &cntlr
.ich9_spi
->hsfs
);
713 addr
= readl_(&cntlr
.ich9_spi
->faddr
) & 0x01FFFFFF;
714 hsfc
= readw_(&cntlr
.ich9_spi
->hsfc
);
715 printk(BIOS_ERR
, "Transaction timeout between offset 0x%08x and "
716 "0x%08x (= 0x%08x + %d) HSFC=%x HSFS=%x!\n",
717 addr
, addr
+ len
- 1, addr
, len
- 1,
722 if (hsfs
& HSFS_FCERR
) {
724 addr
= readl_(&cntlr
.ich9_spi
->faddr
) & 0x01FFFFFF;
725 hsfc
= readw_(&cntlr
.ich9_spi
->hsfc
);
726 printk(BIOS_ERR
, "Transaction error between offset 0x%08x and "
727 "0x%08x (= 0x%08x + %d) HSFC=%x HSFS=%x!\n",
728 addr
, addr
+ len
- 1, addr
, len
- 1,
736 static int ich_hwseq_erase(const struct spi_flash
*flash
, u32 offset
,
739 u32 start
, end
, erase_size
;
742 unsigned int timeout
= 1000 * SPI_FLASH_SECTOR_ERASE_TIMEOUT_MS
;
744 erase_size
= flash
->sector_size
;
745 if (offset
% erase_size
|| len
% erase_size
) {
746 printk(BIOS_ERR
, "SF: Erase offset/length not multiple of erase size\n");
750 ret
= spi_claim_bus(&flash
->spi
);
752 printk(BIOS_ERR
, "SF: Unable to claim SPI bus\n");
759 while (offset
< end
) {
760 /* make sure FDONE, FCERR, AEL are cleared by writing 1 to them */
761 writew_(readw_(&cntlr
.ich9_spi
->hsfs
), &cntlr
.ich9_spi
->hsfs
);
763 ich_hwseq_set_addr(offset
);
765 offset
+= erase_size
;
767 hsfc
= readw_(&cntlr
.ich9_spi
->hsfc
);
768 hsfc
&= ~HSFC_FCYCLE
; /* clear operation */
769 hsfc
|= (0x3 << HSFC_FCYCLE_OFF
); /* set erase operation */
770 hsfc
|= HSFC_FGO
; /* start */
771 writew_(hsfc
, &cntlr
.ich9_spi
->hsfc
);
772 if (ich_hwseq_wait_for_cycle_complete(timeout
, len
)) {
773 printk(BIOS_ERR
, "SF: Erase failed at %x\n", offset
- erase_size
);
779 printk(BIOS_DEBUG
, "SF: Successfully erased %zu bytes @ %#x\n", len
, start
);
782 spi_release_bus(&flash
->spi
);
786 static void ich_read_data(uint8_t *data
, int len
)
791 for (i
= 0; i
< len
; i
++) {
793 temp32
= readl_(cntlr
.data
+ i
);
795 data
[i
] = (temp32
>> ((i
% 4) * 8)) & 0xff;
799 static int ich_hwseq_read(const struct spi_flash
*flash
, u32 addr
, size_t len
,
803 uint16_t timeout
= 100 * 60;
806 if (addr
+ len
> flash
->size
) {
808 "Attempt to read %x-%x which is out of chip\n",
810 (unsigned int) addr
+(unsigned int) len
);
814 /* clear FDONE, FCERR, AEL by writing 1 to them (if they are set) */
815 writew_(readw_(&cntlr
.ich9_spi
->hsfs
), &cntlr
.ich9_spi
->hsfs
);
818 block_len
= MIN(len
, cntlr
.databytes
);
819 if (block_len
> (~addr
& 0xff))
820 block_len
= (~addr
& 0xff) + 1;
821 ich_hwseq_set_addr(addr
);
822 hsfc
= readw_(&cntlr
.ich9_spi
->hsfc
);
823 hsfc
&= ~HSFC_FCYCLE
; /* set read operation */
824 hsfc
&= ~HSFC_FDBC
; /* clear byte count */
826 hsfc
|= (((block_len
- 1) << HSFC_FDBC_OFF
) & HSFC_FDBC
);
827 hsfc
|= HSFC_FGO
; /* start */
828 writew_(hsfc
, &cntlr
.ich9_spi
->hsfc
);
830 if (ich_hwseq_wait_for_cycle_complete(timeout
, block_len
))
832 ich_read_data(buf
, block_len
);
840 /* Fill len bytes from the data array into the fdata/spid registers.
842 * Note that using len > flash->pgm->spi.max_data_write will trash the registers
843 * following the data registers.
845 static void ich_fill_data(const uint8_t *data
, int len
)
853 for (i
= 0; i
< len
; i
++) {
857 temp32
|= ((uint32_t) data
[i
]) << ((i
% 4) * 8);
859 if ((i
% 4) == 3) /* 32 bits are full, write them to regs. */
860 writel_(temp32
, cntlr
.data
+ (i
- (i
% 4)));
863 if ((i
% 4) != 3) /* Write remaining data to regs. */
864 writel_(temp32
, cntlr
.data
+ (i
- (i
% 4)));
867 static int ich_hwseq_write(const struct spi_flash
*flash
, u32 addr
, size_t len
,
871 uint16_t timeout
= 100 * 60;
873 uint32_t start
= addr
;
875 if (addr
+ len
> flash
->size
) {
877 "Attempt to write 0x%x-0x%x which is out of chip\n",
878 (unsigned int)addr
, (unsigned int) (addr
+len
));
882 /* clear FDONE, FCERR, AEL by writing 1 to them (if they are set) */
883 writew_(readw_(&cntlr
.ich9_spi
->hsfs
), &cntlr
.ich9_spi
->hsfs
);
886 block_len
= MIN(len
, cntlr
.databytes
);
887 if (block_len
> (~addr
& 0xff))
888 block_len
= (~addr
& 0xff) + 1;
890 ich_hwseq_set_addr(addr
);
892 ich_fill_data(buf
, block_len
);
893 hsfc
= readw_(&cntlr
.ich9_spi
->hsfc
);
894 hsfc
&= ~HSFC_FCYCLE
; /* clear operation */
895 hsfc
|= (0x2 << HSFC_FCYCLE_OFF
); /* set write operation */
896 hsfc
&= ~HSFC_FDBC
; /* clear byte count */
898 hsfc
|= (((block_len
- 1) << HSFC_FDBC_OFF
) & HSFC_FDBC
);
899 hsfc
|= HSFC_FGO
; /* start */
900 writew_(hsfc
, &cntlr
.ich9_spi
->hsfc
);
902 if (ich_hwseq_wait_for_cycle_complete(timeout
, block_len
)) {
903 printk(BIOS_ERR
, "SF: write failure at %x\n",
911 printk(BIOS_DEBUG
, "SF: Successfully written %u bytes @ %#x\n",
912 (unsigned int) (addr
- start
), start
);
916 static const struct spi_flash_ops spi_flash_ops
= {
917 .read
= ich_hwseq_read
,
918 .write
= ich_hwseq_write
,
919 .erase
= ich_hwseq_erase
,
922 static int spi_flash_programmer_probe(const struct spi_slave
*spi
,
923 struct spi_flash
*flash
)
926 if (CONFIG(SOUTHBRIDGE_INTEL_I82801GX
))
927 return spi_flash_generic_probe(spi
, flash
);
929 /* Try generic probing first if spi_is_multichip returns 0. */
930 if (!spi_is_multichip() && !spi_flash_generic_probe(spi
, flash
))
933 memcpy(&flash
->spi
, spi
, sizeof(*spi
));
934 flash
->name
= "Opaque HW-sequencing";
936 ich_hwseq_set_addr(0);
937 switch ((cntlr
.hsfs
>> 3) & 3) {
939 flash
->sector_size
= 256;
942 flash
->sector_size
= 4096;
945 flash
->sector_size
= 8192;
948 flash
->sector_size
= 65536;
952 flash
->size
= 1 << (19 + (cntlr
.flcomp
& 7));
954 flash
->ops
= &spi_flash_ops
;
956 if ((cntlr
.hsfs
& HSFS_FDV
) && ((cntlr
.flmap0
>> 8) & 3))
957 flash
->size
+= 1 << (19 + ((cntlr
.flcomp
>> 3) & 7));
958 printk(BIOS_DEBUG
, "flash size 0x%x bytes\n", flash
->size
);
963 static int xfer_vectors(const struct spi_slave
*slave
,
964 struct spi_op vectors
[], size_t count
)
966 return spi_flash_vector_helper(slave
, vectors
, count
, spi_ctrlr_xfer
);
969 #define SPI_FPR_SHIFT 12
970 #define ICH7_SPI_FPR_MASK 0xfff
971 #define ICH9_SPI_FPR_MASK 0x1fff
972 #define SPI_FPR_BASE_SHIFT 0
973 #define ICH7_SPI_FPR_LIMIT_SHIFT 12
974 #define ICH9_SPI_FPR_LIMIT_SHIFT 16
975 #define ICH9_SPI_FPR_RPE (1 << 15) /* Read Protect */
976 #define SPI_FPR_WPE (1 << 31) /* Write Protect */
978 static u32
spi_fpr(u32 base
, u32 limit
)
981 u32 mask
, limit_shift
;
983 if (CONFIG(SOUTHBRIDGE_INTEL_I82801GX
)) {
984 mask
= ICH7_SPI_FPR_MASK
;
985 limit_shift
= ICH7_SPI_FPR_LIMIT_SHIFT
;
987 mask
= ICH9_SPI_FPR_MASK
;
988 limit_shift
= ICH9_SPI_FPR_LIMIT_SHIFT
;
990 ret
= ((limit
>> SPI_FPR_SHIFT
) & mask
) << limit_shift
;
991 ret
|= ((base
>> SPI_FPR_SHIFT
) & mask
) << SPI_FPR_BASE_SHIFT
;
996 * Protect range of SPI flash defined by [start, start+size-1] using Flash
997 * Protected Range (FPR) register if available.
998 * Returns 0 on success, -1 on failure of programming fpr registers.
1000 static int spi_flash_protect(const struct spi_flash
*flash
,
1001 const struct region
*region
,
1002 const enum ctrlr_prot_type type
)
1004 u32 start
= region_offset(region
);
1005 u32 end
= start
+ region_sz(region
) - 1;
1007 u32 protect_mask
= 0;
1011 fpr_base
= cntlr
.fpr
;
1013 /* Find first empty FPR */
1014 for (fpr
= 0; fpr
< cntlr
.fpr_max
; fpr
++) {
1015 reg
= read32(&fpr_base
[fpr
]);
1020 if (fpr
== cntlr
.fpr_max
) {
1021 printk(BIOS_ERR
, "ERROR: No SPI FPR free!\n");
1027 protect_mask
|= SPI_FPR_WPE
;
1030 if (CONFIG(SOUTHBRIDGE_INTEL_I82801GX
))
1032 protect_mask
|= ICH9_SPI_FPR_RPE
;
1034 case READ_WRITE_PROTECT
:
1035 if (CONFIG(SOUTHBRIDGE_INTEL_I82801GX
))
1037 protect_mask
|= (ICH9_SPI_FPR_RPE
| SPI_FPR_WPE
);
1040 printk(BIOS_ERR
, "ERROR: Seeking invalid protection!\n");
1044 /* Set protected range base and limit */
1045 reg
= spi_fpr(start
, end
) | protect_mask
;
1047 /* Set the FPR register and verify it is protected */
1048 write32(&fpr_base
[fpr
], reg
);
1049 if (reg
!= read32(&fpr_base
[fpr
])) {
1050 printk(BIOS_ERR
, "ERROR: Unable to set SPI FPR %d\n", fpr
);
1054 printk(BIOS_INFO
, "%s: FPR %d is enabled for range 0x%08x-0x%08x\n",
1055 __func__
, fpr
, start
, end
);
1059 void spi_finalize_ops(void)
1063 struct intel_swseq_spi_config spi_config_default
= {
1064 {0x06, 0x50}, /* OPPREFIXES: EWSR and WREN */
1065 { /* OPCODE and OPTYPE */
1066 {0x01, WRITE_NO_ADDR
}, /* WRSR: Write Status Register */
1067 {0x02, WRITE_WITH_ADDR
}, /* BYPR: Byte Program */
1068 {0x03, READ_WITH_ADDR
}, /* READ: Read Data */
1069 {0x05, READ_NO_ADDR
}, /* RDSR: Read Status Register */
1070 {0x20, WRITE_WITH_ADDR
}, /* SE20: Sector Erase 0x20 */
1071 {0x9f, READ_NO_ADDR
}, /* RDID: Read ID */
1072 {0xd8, WRITE_WITH_ADDR
}, /* BED8: Block Erase 0xd8 */
1073 {0x0b, READ_WITH_ADDR
}, /* FAST: Fast Read */
1076 struct intel_swseq_spi_config spi_config_aai_write
= {
1077 {0x06, 0x50}, /* OPPREFIXES: EWSR and WREN */
1078 { /* OPCODE and OPTYPE */
1079 {0x01, WRITE_NO_ADDR
}, /* WRSR: Write Status Register */
1080 {0x02, WRITE_WITH_ADDR
}, /* BYPR: Byte Program */
1081 {0x03, READ_WITH_ADDR
}, /* READ: Read Data */
1082 {0x05, READ_NO_ADDR
}, /* RDSR: Read Status Register */
1083 {0x20, WRITE_WITH_ADDR
}, /* SE20: Sector Erase 0x20 */
1084 {0x9f, READ_NO_ADDR
}, /* RDID: Read ID */
1085 {0xad, WRITE_NO_ADDR
}, /* Auto Address Increment Word Program */
1086 {0x04, WRITE_NO_ADDR
} /* Write Disable */
1089 const struct spi_flash
*flash
= boot_device_spi_flash();
1090 struct intel_swseq_spi_config
*spi_config
= &spi_config_default
;
1094 * Some older SST SPI flashes support AAI write but use 0xaf opcde for
1095 * that. Flashrom uses the byte program opcode to write those flashes,
1096 * so this configuration is fine too. SST25VF064C (id = 0x4b) is an
1099 if (flash
&& flash
->vendor
== VENDOR_ID_SST
&& (flash
->model
& 0x00ff) != 0x4b)
1100 spi_config
= &spi_config_aai_write
;
1105 intel_southbridge_override_spi(spi_config
);
1107 spi_opprefix
= spi_config
->opprefixes
[0]
1108 | (spi_config
->opprefixes
[1] << 8);
1109 writew_(spi_opprefix
, cntlr
.preop
);
1110 for (i
= 0; i
< ARRAY_SIZE(spi_config
->ops
); i
++) {
1111 optype
|= (spi_config
->ops
[i
].type
& 3) << (i
* 2);
1112 writeb_(spi_config
->ops
[i
].op
, &cntlr
.opmenu
[i
]);
1114 writew_(optype
, cntlr
.optype
);
1117 __weak
void intel_southbridge_override_spi(struct intel_swseq_spi_config
*spi_config
)
1121 static const struct spi_ctrlr spi_ctrlr
= {
1122 .xfer_vector
= xfer_vectors
,
1123 .max_xfer_size
= member_size(struct ich9_spi_regs
, fdata
),
1124 .flash_probe
= spi_flash_programmer_probe
,
1125 .flash_protect
= spi_flash_protect
,
1128 const struct spi_ctrlr_buses spi_ctrlr_bus_map
[] = {
1130 .ctrlr
= &spi_ctrlr
,
1136 const size_t spi_ctrlr_bus_map_count
= ARRAY_SIZE(spi_ctrlr_bus_map
);