[PATCH v3 0/3] spi-nor: Add support for Intel SPI serial flash controller

Stefan Roese sr at denx.de
Wed Oct 5 04:11:39 PDT 2016


On 05.10.2016 12:27, Mika Westerberg wrote:
> On Wed, Oct 05, 2016 at 11:57:46AM +0200, Stefan Roese wrote:
>> Hi Mika,
>>
>> On 15.08.2016 09:10, Mika Westerberg wrote:
>>> This is third version of the series. Previous versions can be found:
>>>
>>>   v2: http://lists.infradead.org/pipermail/linux-mtd/2016-June/068277.html
>>>   v1: https://lkml.org/lkml/2016/6/14/269
>>>
>>> This series adds support for the Intel SPI serial flash controller found on
>>> many recent Intel CPUs including Baytrail and Braswell. This driver makes
>>> it possible to access the BIOS and other platform data which is stored on
>>> the SPI serial flash. It is also possible to upgrade the BIOS using this
>>> driver if it has not been protected by special hardware bits.
>>>
>>> The patch [1/3] includes documentation how to upgrade BIOS on MinnowBoard
>>> MAX.
>>>
>>> Since poking the SPI serial flash can brick the machine, this driver can
>>> only be enabled when CONFIG_EXPERT=y and even then it will remain read-only
>>> unless instructed othwerwise by module parameter.
>>
>> I'm currently testing this driver on a BayTrail based board with
>> a common 8MiB SPI NOR chip. Something special to note is, that I'm
>> using U-Boot as bootloader instead of some BIOS. Accessing the
>> SPI NOR in U-Boot works without problems. Also I'm able to access
>> the SPI NOR in Linux via the flashrom tool just fine.
>>
>> I've now applied your v3 patchset on top of v4.8 and got the SPI NOR
>> driver loaded. But the SPI NOR device is not detected correctly. Here
>> the output of the driver with DEBUG enabled:
>>
>> ...
>> [    3.675891] intel-spi intel-spi: BFPREG=0x07ff0300
>> [    3.675894] intel-spi intel-spi: HSFSTS_CTL=0x00006000
>> [    3.675897] intel-spi intel-spi: FADDR=0x006effc0
>> [    3.675900] intel-spi intel-spi: DLOCK=0x00000000
>> [    3.675902] intel-spi intel-spi: FDATA(0)=0x00000000
>> [    3.675905] intel-spi intel-spi: FDATA(1)=0x00000000
>> [    3.675908] intel-spi intel-spi: FDATA(2)=0x00000000
>> [    3.675910] intel-spi intel-spi: FDATA(3)=0x00000000
>> [    3.675913] intel-spi intel-spi: FDATA(4)=0x00000000
>> [    3.675916] intel-spi intel-spi: FDATA(5)=0x00000000
>> [    3.675918] intel-spi intel-spi: FDATA(6)=0x00000000
>> [    3.675921] intel-spi intel-spi: FDATA(7)=0x00000000
>> [    3.675923] intel-spi intel-spi: FDATA(8)=0x00000000
>> [    3.675926] intel-spi intel-spi: FDATA(9)=0x00000000
>> [    3.675929] intel-spi intel-spi: FDATA(10)=0x00000000
>> [    3.675931] intel-spi intel-spi: FDATA(11)=0x00000000
>> [    3.675934] intel-spi intel-spi: FDATA(12)=0x00000000
>> [    3.675941] intel-spi intel-spi: FDATA(13)=0x00000000
>> [    3.675943] intel-spi intel-spi: FDATA(14)=0x00000000
>> [    3.675946] intel-spi intel-spi: FDATA(15)=0x00000000
>> [    3.675949] intel-spi intel-spi: FRACC=0x0000ffff
>> [    3.675951] intel-spi intel-spi: FREG(0)=0x00000000
>> [    3.675954] intel-spi intel-spi: FREG(1)=0x07ff0300
>> [    3.675957] intel-spi intel-spi: FREG(2)=0x02ff0001
>> [    3.675959] intel-spi intel-spi: FREG(3)=0x00001fff
>> [    3.675962] intel-spi intel-spi: FREG(4)=0x00001fff
>> [    3.675965] intel-spi intel-spi: PR(0)=0x00000000
>> [    3.675967] intel-spi intel-spi: PR(1)=0x00000000
>> [    3.675970] intel-spi intel-spi: PR(2)=0x00000000
>> [    3.675972] intel-spi intel-spi: PR(3)=0x00000000
>> [    3.675975] intel-spi intel-spi: PR(4)=0x00000000
>> [    3.675978] intel-spi intel-spi: PR(5)=0x00000000
>> [    3.675980] intel-spi intel-spi: SSFSTS_CTL=0xf87f00c0
>> [    3.675983] intel-spi intel-spi: PREOP_OPTYPE=0x00020000
>> [    3.675985] intel-spi intel-spi: OPMENU0=0x0000000b
>> [    3.675988] intel-spi intel-spi: OPMENU1=0x00000000
>> [    3.675990] intel-spi intel-spi: BCR=0x00000009
>> [    3.675992] intel-spi intel-spi: Protected regions:
>> [    3.675997] intel-spi intel-spi: Flash regions:
>> [    3.676001] intel-spi intel-spi:  00 base: 0x00000000 limit: 0x00000fff
>> [    3.676004] intel-spi intel-spi:  01 base: 0x00300000 limit: 0x007fffff
>> [    3.676007] intel-spi intel-spi:  02 base: 0x00001000 limit: 0x002fffff
>> [    3.676009] intel-spi intel-spi:  03 disabled
>> [    3.676012] intel-spi intel-spi:  04 disabled
>> [    3.676014] intel-spi intel-spi: Using HW sequencer for register access
> 
> It should not be using HW sequencer on Baytrail. The driver thinks so
> because it wants that both OPMENU0 and OPMENU1 to be set before it
> switches to use SW sequencer.
> 
> You can try to change:
> 
> static int intel_spi_init(struct intel_spi *ispi)
> {
> 	...
> 	if (opmenu0 || opmenu1) {
> 
> but I suppose that's not enough because it does include RDID in the
> OPMENU0 which we use to read the JEDEC ID.
> 
> Since the controller is not locked down (DLOCK is 0) we could program
> those for the OPMENU0 so that it contains 0x00009f0b and maybe something
> more.
> 
> You could try to add
> 
>        writel(0x00009f0b, ispi->sregs + OPMENU0);
> 
> before we read OPMENU0 in the same function.

Thanks. I've made those 2 changes and now the SPI chip is detected
correctly:

...
[    3.654301] intel-spi intel-spi: OPMENU0=0x00009f0b
[    3.654304] intel-spi intel-spi: OPMENU1=0x00000000
[    3.654306] intel-spi intel-spi: BCR=0x00000009
[    3.654308] intel-spi intel-spi: Protected regions:
[    3.654313] intel-spi intel-spi: Flash regions:
[    3.654316] intel-spi intel-spi:  00 base: 0x00000000 limit: 0x00000fff
[    3.654320] intel-spi intel-spi:  01 base: 0x00300000 limit: 0x007fffff
[    3.654323] intel-spi intel-spi:  02 base: 0x00001000 limit: 0x002fffff
[    3.654325] intel-spi intel-spi:  03 disabled
[    3.654328] intel-spi intel-spi:  04 disabled
[    3.654330] intel-spi intel-spi: Using SW sequencer for register access
[    3.657488] intel-spi intel-spi: s25fl064k (8192 Kbytes)
[    3.677241] Creating 1 MTD partitions on "intel-spi":
[    3.682310] 0x000000000000-0x000000800000 : "BIOS"
...

So how do you suggest to support such BayTrail boards booting
via U-Boot as bootloader? Should U-Boot write something into
these OPMENU0/1 registers before booting into Linux?

Thanks,
Stefan



More information about the linux-mtd mailing list