public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* Hardcoded IDE Controller B/D/F (0/1/1) in BdsPlatform.c?
@ 2018-11-22  0:06 Bryan Rosario
       [not found] ` <8147e54ded6e405abdafbed45bd52199@SCL-EXCHMB-13.phoenix.com>
  2018-11-22 16:40 ` Laszlo Ersek
  0 siblings, 2 replies; 5+ messages in thread
From: Bryan Rosario @ 2018-11-22  0:06 UTC (permalink / raw)
  To: edk2-devel; +Cc: Alain Gefflaut

Hi all,

I noticed that there is apparently a hardcoded B/D/F for an IDE Controller
in BdsPlatform.c, when setting bit 15 of a particular register:
https://github.com/tianocore/edk2/blob/14923c1a6bf9940b48feeaf47cb5d6c662b6528c/OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c#L1612-L1617
.

Why is this hardcoded? Is it just old code that has hung around? I noticed
that this code is from this commit, and the surrounding code at the time
had lots of hardcoded B/D/Fs:
https://github.com/tianocore/edk2/commit/40f2c454343be84ab3bacf9955cc8d7842c70b5c
.

The context of this question is that I'm trying to make this work in a
configuration with an IDE Controller located at a different B/D/F, and so
the hardcoded value of 0/1/1 doesn't work for me.

If I want to change this so that it's not hardcoded, what is a good
approach? I've added some code locally to the IdeInitSetTiming function in
SataController.c to set the bit using the PciIo structure which is opened
specifically on the controller in question -- does that sound like the
right approach?
Link to the function I'm referring to:
https://github.com/tianocore/edk2/blob/f6b0258d25a63ae3d3bc6430abe30fb625abc52a/OvmfPkg/SataControllerDxe/SataController.c#L1091-L1099

Thanks,
Bryan


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Hardcoded IDE Controller B/D/F (0/1/1) in BdsPlatform.c?
       [not found] ` <8147e54ded6e405abdafbed45bd52199@SCL-EXCHMB-13.phoenix.com>
@ 2018-11-22  1:28   ` Bryan Rosario
  2018-11-22  2:06     ` Ken Taylor
  0 siblings, 1 reply; 5+ messages in thread
From: Bryan Rosario @ 2018-11-22  1:28 UTC (permalink / raw)
  To: Ken_Taylor; +Cc: Alain Gefflaut, edk2-devel

Hi Ken,

That's what I had guessed -- thanks for confirming that it's platform
specific.

In my use case, I actually want the code to work on multiple hardware
configurations, so I can't just replace the hardcoded B/D/F with the one
used by a particular platform. Does the change to SataController.c that I
mentioned in the original email make sense? I've tested it and confirmed
that it works on my platform, but I want to get a sanity check that that is
an appropriate place to put this code.

Thanks,
Bryan

On Wed, Nov 21, 2018 at 4:48 PM Ken Taylor <Ken_Taylor@phoenix.com> wrote:

> Hi Bryan,
>
> That appears to be silicon or platform specific code.  It's intended for
> one specific hardware configuration.  Unless you have an identical hardware
> configuration, those particular register writes are actually nonsensical.
>
> I think what you need to do is consult the silicon specific documentation
> for your particular hardware configuration, and determine what silicon
> specific registers need to be configured to what specific values to support
> your specific hardware design.
>
> Regards,
> -Ken.
>
> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
> Bryan Rosario via edk2-devel
> Sent: Wednesday, November 21, 2018 4:07 PM
> To: edk2-devel@lists.01.org
> Cc: Alain Gefflaut
> Subject: [edk2] Hardcoded IDE Controller B/D/F (0/1/1) in BdsPlatform.c?
>
> Hi all,
>
> I noticed that there is apparently a hardcoded B/D/F for an IDE Controller
> in BdsPlatform.c, when setting bit 15 of a particular register:
>
> https://github.com/tianocore/edk2/blob/14923c1a6bf9940b48feeaf47cb5d6c662b6528c/OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c#L1612-L1617
> .
>
> Why is this hardcoded? Is it just old code that has hung around? I noticed
> that this code is from this commit, and the surrounding code at the time
> had lots of hardcoded B/D/Fs:
>
> https://github.com/tianocore/edk2/commit/40f2c454343be84ab3bacf9955cc8d7842c70b5c
> .
>
> The context of this question is that I'm trying to make this work in a
> configuration with an IDE Controller located at a different B/D/F, and so
> the hardcoded value of 0/1/1 doesn't work for me.
>
> If I want to change this so that it's not hardcoded, what is a good
> approach? I've added some code locally to the IdeInitSetTiming function in
> SataController.c to set the bit using the PciIo structure which is opened
> specifically on the controller in question -- does that sound like the
> right approach?
> Link to the function I'm referring to:
>
> https://github.com/tianocore/edk2/blob/f6b0258d25a63ae3d3bc6430abe30fb625abc52a/OvmfPkg/SataControllerDxe/SataController.c#L1091-L1099
>
> Thanks,
> Bryan
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel
>
>


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Hardcoded IDE Controller B/D/F (0/1/1) in BdsPlatform.c?
  2018-11-22  1:28   ` Bryan Rosario
@ 2018-11-22  2:06     ` Ken Taylor
  2018-11-22  3:05       ` Bryan Rosario
  0 siblings, 1 reply; 5+ messages in thread
From: Ken Taylor @ 2018-11-22  2:06 UTC (permalink / raw)
  To: Bryan Rosario; +Cc: Alain Gefflaut, edk2-devel@lists.01.org

Hi Bryan,

If you were talking about PC architecture, I would suggest that there should be a hierarchy of configuration that needs to occur.  Specifically, there should be silicon / board / platform specific configuration that is architecturally independent of the SATA driver.

Normally, there would be early initialization to write to silicon specific registers.  Later, the PCI bus driver should expose PCI device interfaces.  That driver would normally be responsible for writing to the PCI configuration header for the device, as well as for configuring any PCI bridges between the host bus and the device.

The SATA driver would then connect to the PCI device interface exposed by the PCI bus driver.

However, I think you’re using an ARM based system.  The architecture is different from what I am used to.  Is what you have is a SATA driver talking directly to the PCI device interface?  This skips several levels of the architecture that would be responsible for maintaining platform independence.

If it were me, I would only put generic SATA code in the SATA driver.  There wouldn’t be anything silicon or platform specific at all.

If we were talking about the old IDE interfaces (because CF maybe), there used to be stuff for configuring 80 conductor vs 40 conductor cables that was handled by legacy BIOSes, and configuring high speed DMA and PIO transfer modes was silicon specific.  In the legacy architectures I worked on, there was usually an interface for silicon specific configuration that was architecturally independent of the IDE driver itself.

If you are facing the same sort of thing, then I would define a protocol for features that may require silicon specific register writes, and make my SATA code call that protocol.  This allows you to keep all your silicon/board/platform specific code in one location (perhaps one per design), and you don’t have to touch as many files every time your hardware design changes.  Ideally, you should have all the things that need to change boiled down to one particular piece of code, so you can focus on what you need to do to make new hardware work when you get new hardware and don’t have to discover all sorts of files that need editing piecemeal as you discover non-functional hardware features.

Regards,
-Ken.

From: Bryan Rosario [mailto:bcr@google.com]
Sent: Wednesday, November 21, 2018 5:29 PM
To: Ken Taylor
Cc: Alain Gefflaut; edk2-devel@lists.01.org
Subject: Re: [edk2] Hardcoded IDE Controller B/D/F (0/1/1) in BdsPlatform.c?

Hi Ken,

That's what I had guessed -- thanks for confirming that it's platform specific.

In my use case, I actually want the code to work on multiple hardware configurations, so I can't just replace the hardcoded B/D/F with the one used by a particular platform. Does the change to SataController.c that I mentioned in the original email make sense? I've tested it and confirmed that it works on my platform, but I want to get a sanity check that that is an appropriate place to put this code.

Thanks,
Bryan

On Wed, Nov 21, 2018 at 4:48 PM Ken Taylor <Ken_Taylor@phoenix.com<mailto:Ken_Taylor@phoenix.com>> wrote:
Hi Bryan,

That appears to be silicon or platform specific code.  It's intended for one specific hardware configuration.  Unless you have an identical hardware configuration, those particular register writes are actually nonsensical.

I think what you need to do is consult the silicon specific documentation for your particular hardware configuration, and determine what silicon specific registers need to be configured to what specific values to support your specific hardware design.

Regards,
-Ken.

-----Original Message-----
From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org<mailto:edk2-devel-bounces@lists.01.org>] On Behalf Of Bryan Rosario via edk2-devel
Sent: Wednesday, November 21, 2018 4:07 PM
To: edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org>
Cc: Alain Gefflaut
Subject: [edk2] Hardcoded IDE Controller B/D/F (0/1/1) in BdsPlatform.c?

Hi all,

I noticed that there is apparently a hardcoded B/D/F for an IDE Controller in BdsPlatform.c, when setting bit 15 of a particular register:
https://github.com/tianocore/edk2/blob/14923c1a6bf9940b48feeaf47cb5d6c662b6528c/OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c#L1612-L1617
.

Why is this hardcoded? Is it just old code that has hung around? I noticed that this code is from this commit, and the surrounding code at the time had lots of hardcoded B/D/Fs:
https://github.com/tianocore/edk2/commit/40f2c454343be84ab3bacf9955cc8d7842c70b5c
.

The context of this question is that I'm trying to make this work in a configuration with an IDE Controller located at a different B/D/F, and so the hardcoded value of 0/1/1 doesn't work for me.

If I want to change this so that it's not hardcoded, what is a good approach? I've added some code locally to the IdeInitSetTiming function in SataController.c to set the bit using the PciIo structure which is opened specifically on the controller in question -- does that sound like the right approach?
Link to the function I'm referring to:
https://github.com/tianocore/edk2/blob/f6b0258d25a63ae3d3bc6430abe30fb625abc52a/OvmfPkg/SataControllerDxe/SataController.c#L1091-L1099

Thanks,
Bryan
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org<mailto:edk2-devel@lists.01.org>
https://lists.01.org/mailman/listinfo/edk2-devel

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Hardcoded IDE Controller B/D/F (0/1/1) in BdsPlatform.c?
  2018-11-22  2:06     ` Ken Taylor
@ 2018-11-22  3:05       ` Bryan Rosario
  0 siblings, 0 replies; 5+ messages in thread
From: Bryan Rosario @ 2018-11-22  3:05 UTC (permalink / raw)
  To: Ken_Taylor; +Cc: Alain Gefflaut, edk2-devel

This is for a virtual x86 platform using OVMF. I think I have enough info
at this point to get things set up. Thanks for the help.

Bryan

On Wed, Nov 21, 2018 at 6:06 PM Ken Taylor <Ken_Taylor@phoenix.com> wrote:

> Hi Bryan,
>
>
>
> If you were talking about PC architecture, I would suggest that there
> should be a hierarchy of configuration that needs to occur.  Specifically,
> there should be silicon / board / platform specific configuration that is
> architecturally independent of the SATA driver.
>
>
>
> Normally, there would be early initialization to write to silicon specific
> registers.  Later, the PCI bus driver should expose PCI device interfaces.
> That driver would normally be responsible for writing to the PCI
> configuration header for the device, as well as for configuring any PCI
> bridges between the host bus and the device.
>
>
>
> The SATA driver would then connect to the PCI device interface exposed by
> the PCI bus driver.
>
>
>
> However, I think you’re using an ARM based system.  The architecture is
> different from what I am used to.  Is what you have is a SATA driver
> talking directly to the PCI device interface?  This skips several levels of
> the architecture that would be responsible for maintaining platform
> independence.
>
>
>
> If it were me, I would only put generic SATA code in the SATA driver.
> There wouldn’t be anything silicon or platform specific at all.
>
>
>
> If we were talking about the old IDE interfaces (because CF maybe), there
> used to be stuff for configuring 80 conductor vs 40 conductor cables that
> was handled by legacy BIOSes, and configuring high speed DMA and PIO
> transfer modes was silicon specific.  In the legacy architectures I worked
> on, there was usually an interface for silicon specific configuration that
> was architecturally independent of the IDE driver itself.
>
>
>
> If you are facing the same sort of thing, then I would define a protocol
> for features that may require silicon specific register writes, and make my
> SATA code call that protocol.  This allows you to keep all your
> silicon/board/platform specific code in one location (perhaps one per
> design), and you don’t have to touch as many files every time your hardware
> design changes.  Ideally, you should have all the things that need to
> change boiled down to one particular piece of code, so you can focus on
> what you need to do to make new hardware work when you get new hardware and
> don’t have to discover all sorts of files that need editing piecemeal as
> you discover non-functional hardware features.
>
>
>
> Regards,
>
> -Ken.
>
>
>
> *From:* Bryan Rosario [mailto:bcr@google.com]
> *Sent:* Wednesday, November 21, 2018 5:29 PM
> *To:* Ken Taylor
> *Cc:* Alain Gefflaut; edk2-devel@lists.01.org
> *Subject:* Re: [edk2] Hardcoded IDE Controller B/D/F (0/1/1) in
> BdsPlatform.c?
>
>
>
> Hi Ken,
>
>
>
> That's what I had guessed -- thanks for confirming that it's platform
> specific.
>
>
>
> In my use case, I actually want the code to work on multiple hardware
> configurations, so I can't just replace the hardcoded B/D/F with the one
> used by a particular platform. Does the change to SataController.c that I
> mentioned in the original email make sense? I've tested it and confirmed
> that it works on my platform, but I want to get a sanity check that that is
> an appropriate place to put this code.
>
>
>
> Thanks,
>
> Bryan
>
>
>
> On Wed, Nov 21, 2018 at 4:48 PM Ken Taylor <Ken_Taylor@phoenix.com> wrote:
>
> Hi Bryan,
>
> That appears to be silicon or platform specific code.  It's intended for
> one specific hardware configuration.  Unless you have an identical hardware
> configuration, those particular register writes are actually nonsensical.
>
> I think what you need to do is consult the silicon specific documentation
> for your particular hardware configuration, and determine what silicon
> specific registers need to be configured to what specific values to support
> your specific hardware design.
>
> Regards,
> -Ken.
>
> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
> Bryan Rosario via edk2-devel
> Sent: Wednesday, November 21, 2018 4:07 PM
> To: edk2-devel@lists.01.org
> Cc: Alain Gefflaut
> Subject: [edk2] Hardcoded IDE Controller B/D/F (0/1/1) in BdsPlatform.c?
>
> Hi all,
>
> I noticed that there is apparently a hardcoded B/D/F for an IDE Controller
> in BdsPlatform.c, when setting bit 15 of a particular register:
>
> https://github.com/tianocore/edk2/blob/14923c1a6bf9940b48feeaf47cb5d6c662b6528c/OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c#L1612-L1617
> .
>
> Why is this hardcoded? Is it just old code that has hung around? I noticed
> that this code is from this commit, and the surrounding code at the time
> had lots of hardcoded B/D/Fs:
>
> https://github.com/tianocore/edk2/commit/40f2c454343be84ab3bacf9955cc8d7842c70b5c
> .
>
> The context of this question is that I'm trying to make this work in a
> configuration with an IDE Controller located at a different B/D/F, and so
> the hardcoded value of 0/1/1 doesn't work for me.
>
> If I want to change this so that it's not hardcoded, what is a good
> approach? I've added some code locally to the IdeInitSetTiming function in
> SataController.c to set the bit using the PciIo structure which is opened
> specifically on the controller in question -- does that sound like the
> right approach?
> Link to the function I'm referring to:
>
> https://github.com/tianocore/edk2/blob/f6b0258d25a63ae3d3bc6430abe30fb625abc52a/OvmfPkg/SataControllerDxe/SataController.c#L1091-L1099
>
> Thanks,
> Bryan
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel
>
>


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Hardcoded IDE Controller B/D/F (0/1/1) in BdsPlatform.c?
  2018-11-22  0:06 Hardcoded IDE Controller B/D/F (0/1/1) in BdsPlatform.c? Bryan Rosario
       [not found] ` <8147e54ded6e405abdafbed45bd52199@SCL-EXCHMB-13.phoenix.com>
@ 2018-11-22 16:40 ` Laszlo Ersek
  1 sibling, 0 replies; 5+ messages in thread
From: Laszlo Ersek @ 2018-11-22 16:40 UTC (permalink / raw)
  To: Bryan Rosario, edk2-devel; +Cc: Alain Gefflaut

On 11/22/18 01:06, Bryan Rosario via edk2-devel wrote:
> Hi all,
> 
> I noticed that there is apparently a hardcoded B/D/F for an IDE Controller
> in BdsPlatform.c, when setting bit 15 of a particular register:
> https://github.com/tianocore/edk2/blob/14923c1a6bf9940b48feeaf47cb5d6c662b6528c/OvmfPkg/Library/PlatformBootManagerLib/BdsPlatform.c#L1612-L1617
> .
> 
> Why is this hardcoded? Is it just old code that has hung around?

It's ancient code that should not exist, arguably. I've always been
afraid to rip it out, because I've never known what would break.

In general, BDS has zero business writing register of various PCI
devices. Even if it does, due to various platform glitches or hacks, BDS
should preferably not use PciLib APIs for that, but the UEFI PciIo
protocol. (I totally know that OVMF's Platform BDS does not live up to
this.)

> I noticed
> that this code is from this commit, and the surrounding code at the time
> had lots of hardcoded B/D/Fs:
> https://github.com/tianocore/edk2/commit/40f2c454343be84ab3bacf9955cc8d7842c70b5c
> .
> 
> The context of this question is that I'm trying to make this work in a
> configuration with an IDE Controller located at a different B/D/F, and so
> the hardcoded value of 0/1/1 doesn't work for me.
> 
> If I want to change this so that it's not hardcoded, what is a good
> approach?

Remove it altogether from BDS (or else move it to the specific UEFI
driver) and see if things still work. :)

> I've added some code locally to the IdeInitSetTiming function in
> SataController.c to set the bit using the PciIo structure which is opened
> specifically on the controller in question -- does that sound like the
> right approach?

Definitely. It certainly helps if you know what those register writes
actually mean. (I don't.)

Thanks,
Laszlo

> Link to the function I'm referring to:
> https://github.com/tianocore/edk2/blob/f6b0258d25a63ae3d3bc6430abe30fb625abc52a/OvmfPkg/SataControllerDxe/SataController.c#L1091-L1099




^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2018-11-22 16:40 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-11-22  0:06 Hardcoded IDE Controller B/D/F (0/1/1) in BdsPlatform.c? Bryan Rosario
     [not found] ` <8147e54ded6e405abdafbed45bd52199@SCL-EXCHMB-13.phoenix.com>
2018-11-22  1:28   ` Bryan Rosario
2018-11-22  2:06     ` Ken Taylor
2018-11-22  3:05       ` Bryan Rosario
2018-11-22 16:40 ` Laszlo Ersek

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox