From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f68.google.com (mail-wm1-f68.google.com [209.85.128.68]) by mx.groups.io with SMTP id smtpd.web11.4405.1588068250893197452 for ; Tue, 28 Apr 2020 03:04:11 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@akeo-ie.20150623.gappssmtp.com header.s=20150623 header.b=yRTZSKw6; spf=none, err=permanent DNS error (domain: akeo.ie, ip: 209.85.128.68, mailfrom: pete@akeo.ie) Received: by mail-wm1-f68.google.com with SMTP id u16so2157168wmc.5 for ; Tue, 28 Apr 2020 03:04:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=akeo-ie.20150623.gappssmtp.com; s=20150623; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=SmQId9Npi3h2eIqRqPHZGlxGw7YpArKoaB2pDidLPqU=; b=yRTZSKw6FRoX1vIhB81PJ+VRZFyt3ENUH1ldHFSWjluHVIMvBqv5xC6sd42AEjAWkT VWJIZNpTaNZCoqm/5J029IrdsIaF36ybJAI0T8+4CCkRbp5JtI+4VURiM9e1KvCfviIw 7XjXg4UTLwB+T9JVY495vxUYf9G7JipxceQgnUzQfnW4CifwyyFFaIVWoblKHCJudU4H 9s3bTX1oDDSxLe9ZjPOqzvVPRLPX6U4oZUCnoFOHoDRgHPEjyBvHk1eTUhvlXY//a4O1 eFhJwhYiAGTHvdtzCrTfXCn8yBVT/nNgQJxxQwjloElVB3SJP1gjMIgU7pkOUiATIrEc ChTQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=SmQId9Npi3h2eIqRqPHZGlxGw7YpArKoaB2pDidLPqU=; b=rx6FkbCcrxswDTOiobEJDupmd+jtD3fym98Dzd73g9hyhKz0/pdneAw6RYsNzkK156 PO6CJe6o8NcwRamLos1zCeH6dd4Um1EX4fAnftpkDfC8vlCHUWCOggytiN9lcTri7N/r 5/KmkXSZa5C/xTracuM1zoFMbxAgNgWnkUcLVBnJ2uRbJJWINORjHZdUVAMWIbosUcs5 OBU56AJW7sHA7fjFQNks/q/tmg2mBucQpRN8KwzMti8oKnYRMyiRiy74NKJvXLQ/LwCz euXiTG9MmdgvxA5k1+jdJh0DtuJ+29CKZibk27Ix9Oau9PfDv2HZh6G9kNQfJ0XqPPG1 mXCw== X-Gm-Message-State: AGi0Pua5Ju0Nc6GHQQzcEyf4Y+bzIbVN6b+HN1F2qM6tHItQIo3RXDiA eVC7WWAWfl9gRpGKvPZ3XWSKCg== X-Google-Smtp-Source: APiQypLe8SM/Knmj4p4f+cf0V6bt/N0fhwXwZ3S99jewrLw5iqJZBTiXyst8pLQMJUx6HPImAsFNlA== X-Received: by 2002:a05:600c:225a:: with SMTP id a26mr3716540wmm.104.1588068249360; Tue, 28 Apr 2020 03:04:09 -0700 (PDT) Return-Path: Received: from [10.0.0.122] ([84.203.75.87]) by smtp.googlemail.com with ESMTPSA id h3sm24440615wrm.73.2020.04.28.03.04.07 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 28 Apr 2020 03:04:08 -0700 (PDT) Subject: Re: [edk2-platforms][PATCH] Platform/RaspberryPi: Update Rhpx.asl and Uart.asl to match GpuDevs.asl To: GH Cao , devel@edk2.groups.io Cc: ard.biesheuvel@arm.com, leif@nuviainc.com References: <20200428050907.287-1-driver1998@foxmail.com> From: "Pete Batard" Message-ID: <8ddb693c-f2f6-350f-1d23-f17a4dd63f5b@akeo.ie> Date: Tue, 28 Apr 2020 11:04:07 +0100 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0 MIME-Version: 1.0 In-Reply-To: <20200428050907.287-1-driver1998@foxmail.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-GB Content-Transfer-Encoding: 7bit On 2020.04.28 06:09, GH Cao wrote: > GPU devices are in container GPV0 for DMA constraints now, but references in > Rhpx.asl and Uart.asl are not updated, which breaks the rhproxy driver of > Windows 10. > > Signed-off-by: GH Cao > --- > Platform/RaspberryPi/AcpiTables/Rhpx.asl | 112 +++++++++++------------ > Platform/RaspberryPi/AcpiTables/Uart.asl | 6 +- > 2 files changed, 59 insertions(+), 59 deletions(-) > > diff --git a/Platform/RaspberryPi/AcpiTables/Rhpx.asl b/Platform/RaspberryPi/AcpiTables/Rhpx.asl > index 0971e13..c8a1817 100644 > --- a/Platform/RaspberryPi/AcpiTables/Rhpx.asl > +++ b/Platform/RaspberryPi/AcpiTables/Rhpx.asl > @@ -30,7 +30,7 @@ Device (RHPX) > 4000000, // Connection speed > ClockPolarityLow, // Clock polarity > ClockPhaseFirst, // Clock phase > - "\\_SB.SPI0", // ResourceSource: SPI bus controller name > + "\\_SB.GDV0.SPI0", // ResourceSource: SPI bus controller name > 0, // ResourceSourceIndex > // Resource usage > // DescriptorName: creates name for offset of resource descriptor > @@ -49,7 +49,7 @@ Device (RHPX) > 4000000, // Connection speed > ClockPolarityLow, // Clock polarity > ClockPhaseFirst, // Clock phase > - "\\_SB.SPI0", // ResourceSource: SPI bus controller name > + "\\_SB.GDV0.SPI0", // ResourceSource: SPI bus controller name > 0, // ResourceSourceIndex > // Resource usage > // DescriptorName: creates name for offset of resource descriptor > @@ -61,7 +61,7 @@ Device (RHPX) > , // SlaveMode: default to ControllerInitiated > 0, // ConnectionSpeed: placeholder > , // Addressing Mode: default to 7 bit > - "\\_SB.I2C1", // ResourceSource: I2C bus controller name > + "\\_SB.GDV0.I2C1", // ResourceSource: I2C bus controller name > , > , > , // Descriptor Name: creates name for offset of resource descriptor > @@ -80,92 +80,92 @@ Device (RHPX) > 4000000, // Connection speed > ClockPolarityLow, // Clock polarity > ClockPhaseFirst, // Clock phase > - "\\_SB.SPI1", // ResourceSource: SPI bus controller name > + "\\_SB.GDV0.SPI1", // ResourceSource: SPI bus controller name > 0, // ResourceSourceIndex > // Resource usage > // DescriptorName: creates name for offset of resource descriptor > ) // Vendor Data > > // GPIO 2 > - GpioIO (Shared, PullUp, 0, 0, IoRestrictionNone, "\\_SB.GPI0", 0, ResourceConsumer,,) { 2 } > - GpioInt (Edge, ActiveBoth, Shared, PullUp, 0, "\\_SB.GPI0",) { 2 } > + GpioIO (Shared, PullUp, 0, 0, IoRestrictionNone, "\\_SB.GDV0.GPI0", 0, ResourceConsumer,,) { 2 } > + GpioInt (Edge, ActiveBoth, Shared, PullUp, 0, "\\_SB.GDV0.GPI0",) { 2 } > // GPIO 3 > - GpioIO (Shared, PullUp, 0, 0, IoRestrictionNone, "\\_SB.GPI0", 0, ResourceConsumer,,) { 3 } > - GpioInt (Edge, ActiveBoth, Shared, PullUp, 0, "\\_SB.GPI0",) { 3 } > + GpioIO (Shared, PullUp, 0, 0, IoRestrictionNone, "\\_SB.GDV0.GPI0", 0, ResourceConsumer,,) { 3 } > + GpioInt (Edge, ActiveBoth, Shared, PullUp, 0, "\\_SB.GDV0.GPI0",) { 3 } > // GPIO 4 > - GpioIO (Shared, PullUp, 0, 0, IoRestrictionNone, "\\_SB.GPI0", 0, ResourceConsumer,,) { 4 } > - GpioInt (Edge, ActiveBoth, Shared, PullUp, 0, "\\_SB.GPI0",) { 4 } > + GpioIO (Shared, PullUp, 0, 0, IoRestrictionNone, "\\_SB.GDV0.GPI0", 0, ResourceConsumer,,) { 4 } > + GpioInt (Edge, ActiveBoth, Shared, PullUp, 0, "\\_SB.GDV0.GPI0",) { 4 } > // GPIO 5 > - GpioIO (Shared, PullUp, 0, 0, IoRestrictionNone, "\\_SB.GPI0", 0, ResourceConsumer,,) { 5 } > - GpioInt (Edge, ActiveBoth, Shared, PullUp, 0, "\\_SB.GPI0",) { 5 } > + GpioIO (Shared, PullUp, 0, 0, IoRestrictionNone, "\\_SB.GDV0.GPI0", 0, ResourceConsumer,,) { 5 } > + GpioInt (Edge, ActiveBoth, Shared, PullUp, 0, "\\_SB.GDV0.GPI0",) { 5 } > // GPIO 6 > - GpioIO (Shared, PullUp, 0, 0, IoRestrictionNone, "\\_SB.GPI0", 0, ResourceConsumer,,) { 6 } > - GpioInt (Edge, ActiveBoth, Shared, PullUp, 0, "\\_SB.GPI0",) { 6 } > + GpioIO (Shared, PullUp, 0, 0, IoRestrictionNone, "\\_SB.GDV0.GPI0", 0, ResourceConsumer,,) { 6 } > + GpioInt (Edge, ActiveBoth, Shared, PullUp, 0, "\\_SB.GDV0.GPI0",) { 6 } > // GPIO 7 > - GpioIO (Shared, PullUp, 0, 0, IoRestrictionNone, "\\_SB.GPI0", 0, ResourceConsumer,,) { 7 } > - GpioInt (Edge, ActiveBoth, Shared, PullUp, 0, "\\_SB.GPI0",) { 7 } > + GpioIO (Shared, PullUp, 0, 0, IoRestrictionNone, "\\_SB.GDV0.GPI0", 0, ResourceConsumer,,) { 7 } > + GpioInt (Edge, ActiveBoth, Shared, PullUp, 0, "\\_SB.GDV0.GPI0",) { 7 } > // GPIO 8 > - GpioIO (Shared, PullUp, 0, 0, IoRestrictionNone, "\\_SB.GPI0", 0, ResourceConsumer,,) { 8 } > - GpioInt (Edge, ActiveBoth, Shared, PullUp, 0, "\\_SB.GPI0",) { 8 } > + GpioIO (Shared, PullUp, 0, 0, IoRestrictionNone, "\\_SB.GDV0.GPI0", 0, ResourceConsumer,,) { 8 } > + GpioInt (Edge, ActiveBoth, Shared, PullUp, 0, "\\_SB.GDV0.GPI0",) { 8 } > // GPIO 9 > - GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GPI0", 0, ResourceConsumer,,) { 9 } > - GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GPI0",) { 9 } > + GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GDV0.GPI0", 0, ResourceConsumer,,) { 9 } > + GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GDV0.GPI0",) { 9 } > // GPIO 10 > - GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GPI0", 0, ResourceConsumer,,) { 10 } > - GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GPI0",) { 10 } > + GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GDV0.GPI0", 0, ResourceConsumer,,) { 10 } > + GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GDV0.GPI0",) { 10 } > // GPIO 11 > - GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GPI0", 0, ResourceConsumer,,) { 11 } > - GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GPI0",) { 11 } > + GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GDV0.GPI0", 0, ResourceConsumer,,) { 11 } > + GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GDV0.GPI0",) { 11 } > // GPIO 12 > - GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GPI0", 0, ResourceConsumer,,) { 12 } > - GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GPI0",) { 12 } > + GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GDV0.GPI0", 0, ResourceConsumer,,) { 12 } > + GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GDV0.GPI0",) { 12 } > // GPIO 13 > - GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GPI0", 0, ResourceConsumer,,) { 13 } > - GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GPI0",) { 13 } > + GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GDV0.GPI0", 0, ResourceConsumer,,) { 13 } > + GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GDV0.GPI0",) { 13 } > // NTRAID#MSFT-7141401-2016/04/7-jordanrh - disable UART muxing > // until a proper solution can be created for the dmap conflict > // GPIO 14 - UART TX > - // GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GPI0", 0, ResourceConsumer,,) { 14 } > - // GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GPI0",) { 14 } > + // GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GDV0.GPI0", 0, ResourceConsumer,,) { 14 } > + // GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GDV0.GPI0",) { 14 } > // GPIO 15 - UART RX > - // GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GPI0", 0, ResourceConsumer,,) { 15 } > - // GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GPI0",) { 15 } > + // GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GDV0.GPI0", 0, ResourceConsumer,,) { 15 } > + // GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GDV0.GPI0",) { 15 } > // GPIO 16 > - GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GPI0", 0, ResourceConsumer,,) { 16 } > - GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GPI0",) { 16 } > + GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GDV0.GPI0", 0, ResourceConsumer,,) { 16 } > + GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GDV0.GPI0",) { 16 } > // GPIO 17 > - GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GPI0", 0, ResourceConsumer,,) { 17 } > - GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GPI0",) { 17 } > + GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GDV0.GPI0", 0, ResourceConsumer,,) { 17 } > + GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GDV0.GPI0",) { 17 } > // GPIO 18 > - GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GPI0", 0, ResourceConsumer,,) { 18 } > - GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GPI0",) { 18 } > + GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GDV0.GPI0", 0, ResourceConsumer,,) { 18 } > + GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GDV0.GPI0",) { 18 } > // GPIO 19 > - GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GPI0", 0, ResourceConsumer,,) { 19 } > - GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GPI0",) { 19 } > + GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GDV0.GPI0", 0, ResourceConsumer,,) { 19 } > + GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GDV0.GPI0",) { 19 } > // GPIO 20 > - GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GPI0", 0, ResourceConsumer,,) { 20 } > - GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GPI0",) { 20 } > + GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GDV0.GPI0", 0, ResourceConsumer,,) { 20 } > + GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GDV0.GPI0",) { 20 } > // GPIO 21 > - GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GPI0", 0, ResourceConsumer,,) { 21 } > - GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GPI0",) { 21 } > + GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GDV0.GPI0", 0, ResourceConsumer,,) { 21 } > + GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GDV0.GPI0",) { 21 } > // GPIO 22 > - GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GPI0", 0, ResourceConsumer,,) { 22 } > - GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GPI0",) { 22 } > + GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GDV0.GPI0", 0, ResourceConsumer,,) { 22 } > + GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GDV0.GPI0",) { 22 } > // GPIO 23 > - GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GPI0", 0, ResourceConsumer,,) { 23 } > - GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GPI0",) { 23 } > + GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GDV0.GPI0", 0, ResourceConsumer,,) { 23 } > + GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GDV0.GPI0",) { 23 } > // GPIO 24 > - GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GPI0", 0, ResourceConsumer,,) { 24 } > - GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GPI0",) { 24 } > + GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GDV0.GPI0", 0, ResourceConsumer,,) { 24 } > + GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GDV0.GPI0",) { 24 } > // GPIO 25 > - GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GPI0", 0, ResourceConsumer,,) { 25 } > - GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GPI0",) { 25 } > + GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GDV0.GPI0", 0, ResourceConsumer,,) { 25 } > + GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GDV0.GPI0",) { 25 } > // GPIO 26 > - GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GPI0", 0, ResourceConsumer,,) { 26 } > - GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GPI0",) { 26 } > + GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GDV0.GPI0", 0, ResourceConsumer,,) { 26 } > + GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GDV0.GPI0",) { 26 } > // GPIO 27 > - GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GPI0", 0, ResourceConsumer,,) { 27 } > - GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GPI0",) { 27 } > + GpioIO (Shared, PullDown, 0, 0, IoRestrictionNone, "\\_SB.GDV0.GPI0", 0, ResourceConsumer,,) { 27 } > + GpioInt (Edge, ActiveBoth, Shared, PullDown, 0, "\\_SB.GDV0.GPI0",) { 27 } > }) > > Name (_DSD, Package() > diff --git a/Platform/RaspberryPi/AcpiTables/Uart.asl b/Platform/RaspberryPi/AcpiTables/Uart.asl > index f6a14d6..5a2404f 100644 > --- a/Platform/RaspberryPi/AcpiTables/Uart.asl > +++ b/Platform/RaspberryPi/AcpiTables/Uart.asl > @@ -127,9 +127,9 @@ Device(BTH0) > 16, // ReceiveBufferSize > 16, // TransmitBufferSize > #if (RPI_MODEL == 4) > - "\\_SB.URTM", // ResourceSource: > + "\\_SB.GDV0.URTM", // ResourceSource: > #else > - "\\_SB.URT0", // ResourceSource: > + "\\_SB.GDV0.URT0", // ResourceSource: > #endif > // UART bus controller name > , // ResourceSourceIndex: assumed to be 0 > @@ -142,7 +142,7 @@ Device(BTH0) > // > // RPIQ connection for BT_ON/OFF > // > - GpioIO (Shared, PullUp, 0, 0, IoRestrictionNone, "\\_SB.RPIQ", 0, ResourceConsumer, , ) { 128 } > + GpioIO (Shared, PullUp, 0, 0, IoRestrictionNone, "\\_SB.GDV0.RPIQ", 0, ResourceConsumer, , ) { 128 } > }) > Return (RBUF) > } > Thanks for fixing this! We should really have done the above in commit fcc2a81066a24abac8673c901402316b6b252415 but missed it at the time. Reviewed-by: Pete Batard